FreeSql取多表数据

摘要:
ClassifyId{get;set;}publicClassifyClassify{get;set;}//////标题///[Column]publicstringTitle{get;set;}//////正文///[Column]publicstringContent{get;set;}}Classify.cs[Table]publicclassClassify:FullAduitEntity{publicstringClassifyName{get;set;}publicListArticles{get;set;}}使用现有的导航属性属性Classify为nullListarticles1=_articleRepository.Select.ToList();2.属性Classify会有值我们在前台取数据,也可以直接循环取Classify中的属性Listarticles2=_articleRepository.Select.Include.ToList();假如,后台有一些字段要想过滤掉,可使用AutoMapper,传给前台使用Dto,过滤创建时间,修改时间等审核日志创建ArticleDtopublicclassArticleDto:Entity{//////类别Id///publicint?Listt9=_freeSql.Ado.Query;总结以上取出的数据行数都是一样的。比如上面把Article类中的Classify中的某一个值取出转换成ArticleDto中的ClassifyName

该篇内容由个人博客点击跳转同步更新!转载请注明出处!

以文章随笔与分类为例。

  1. 表结构
    部分字段如下,其他省略,为了展示一对多关联,一个分类下可以有多个文章。一个文章属于一个分类。

blog_article (随笔表)

字段类型备注
idint
classify_idint分类id
titlevarchar(50)标题
contentvarchar(4000)正文

blog_classify (随笔分类专栏)

字段类型备注
idint
ClassifyNamevarchar(50)分类名

其中FullAduitEntity,Entity,在开源项目中,可以自行搜索,其中就是ABP中的创建时间、是否删除等字段

Article.cs

  [Table(Name = "blog_article")]
    public class Article : FullAduitEntity
    {
        /// <summary>
        /// 文章所在分类专栏Id
        /// </summary>
        public int? ClassifyId { get; set; }

        public Classify Classify { get; set; }
        /// <summary>
        /// 标题
        /// </summary>
        [Column(DbType = "varchar(200)")]
        public string Title { get; set; }
        /// <summary>
        /// 正文
        /// </summary>
        [Column(DbType = "text")]
        public string Content { get; set; }
    }

Classify.cs

    [Table(Name = "blog_classify")]
   public class Classify:FullAduitEntity
    {
        public string ClassifyName { get; set; }
        public List<Article> Articles { get; set; }
    }

使用现有的导航属性

  1. 属性Classify为null
List<Article> articles1 = _articleRepository
                        .Select
                        .ToList();

2.属性Classify会有值
我们在前台取数据,也可以直接循环取Classify中的属性

List<Article>articles2=  _articleRepository
    .Select
    .Include(r => r.Classify)
    .ToList();

假如,后台有一些字段要想过滤掉,可使用AutoMapper,传给前台使用Dto,过滤创建时间,修改时间等审核日志

创建 ArticleDto

   public class ArticleDto : Entity
    {
        /// <summary>
        /// 类别Id
        /// </summary>
        public int? ClassifyId { get; set; }
        /// <summary>
        /// 类别名称
        /// </summary>        
        public string ClassifyName { get; set; }
        public string Content { get; set; }
        public string Title { get; set; }
    }

3、配合IMapper,转换为ArticleDto

List<ArticleDto> articles3 = _articleRepository
            .Select
            .ToList(r=>new
            {
                r.Classify,
                Article=r
            }).Select(r=>
            {
                ArticleDto articleDto=_mapper.Map<ArticleDto>(r.Article);
                articleDto.ClassifyName = r.Classify.ClassifyName;
                return articleDto;
            }).ToList();
  1. 同样是使用IMapper转换,但这里Include进去了,用法稍微有点区别。

文档介绍Include"贪婪加载导航属性,如果查询中已经使用了 a.Parent.Parent 类似表达式,则可以无需此操作。。

这里说的查询使用了a.Parent.Parent,是指上面的3中,ToList 中的

  .ToList(r=>new
        {
            r.Classify,
            Article=r
        })

r.Classify,会生成Join功能。如果不想ToList去选择需要的数据,可直接使用Include把需要关联的数据取出。在后面再使用Linq的Select把数据转换下,后面要注意r.Classify可能为null,需要?.取。因为ClassifyId非必填项。

List<ArticleDto> articles4 = _articleRepository
    .Select
    .Include(r => r.Classify)
    .ToList().Select(r =>
    {
        ArticleDto articleDto = _mapper.Map<ArticleDto>(r);
        articleDto.ClassifyName = r.Classify?.ClassifyName;
        return articleDto;
    }).ToList();

直接Join

  1. 不使用关联属性获取文章专栏,这时候类Article中的Classify属性和Classify表中的List<Article>可删除,
List<ArticleDto> articleDtos = _articleRepository
            .Select
            .From<Classify>((a, b) =>a.LeftJoin(r => r.ClassifyId == b.Id)
            ).ToList((s, a) => new
            {
                Article = s,
                a.ClassifyName
            })
            .Select(r =>
            {
                ArticleDto articleDto = _mapper.Map<ArticleDto>(r.Article);
                articleDto.ClassifyName = r.ClassifyName;
                return articleDto;
            }).ToList();

使用SQL直接获取文章及其分类名称

6.SQL需要自己增加is_deleted判断。

List<ArticleDto> t9 = _freeSql.Ado.Query<ArticleDto>($@"
                SELECT a.*,b.item_name as classifyName 
                FROM blog_article a 
                LEFT JOIN base_item b 
                on a.classify_id=b.id where a.is_deleted=0"
);

总结

以上取出的数据行数都是一样的。
一对多。

  1. 写SQL,很简单。
  2. 使用ORM的Join,再配合Mapper就变得复杂了。
  3. 使用导航属性,取关联数据,一个InClude就解决问题了
  4. 使用导航属性,取关联数据,然后再配合Mapper,基本就要看你的Linq、AutoMapper的水平了。哈哈。

比如上面把Article类中的Classify中的某一个值取出转换成ArticleDto中的ClassifyName

免责声明:文章转载自《FreeSql取多表数据》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ThinkPHP 中使用 IS_AJAX 判断原生 JS 中的 Ajax 出现问题ios 关于如何在app里面设置版本更新功能下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Visual studio之C#实现数字输入模拟键盘

所以我想自己实现软键盘。这篇文章是来做记录的。在Load event表单中,添加所有标签控件的click event mybutton _ clicked,privatevoidlazerctrl _ Load{//注册键盘,单击事件keyb1。单击+=newEventHandler;keyb2。单击+=newEventHandler,keyb3。单击++=...

HTTP请求报文

不仅报表样式可以传递请求参数,请求url也可以以类似于键值对的方式传递数据...

C# AES的128位、192位、256位加密

这里将不解释C#AES的128位、192位和256位加密原理。这里我们主要讨论AES的CBC加密模式中128位、192位和256位加密之间的差异,并参考对称加密和块加密的四种模式。16位密钥对应128位加密,24位密钥对应192位加密,32位密钥对应256位加密,矢量必须为16位。“);ifthrownewException(”指定的密钥长度不能小于16位。...

微信分享之分享图片/分享图标不能显示

微信分享的分享图标/图片无法显示,主要是由于以下几个问题:1.确保分享界面调用成功,分享路径正确。2.确保共享图片的路径不使用中文或全半角字符。3.确保副本不包含敏感字符,如红包和收据。当共享接口未能成功加载时,将发生错误。在页面的前面使用隐藏的div来放置要制作缩略图的图片。记住,不能直接隐藏图片。style=“display:noen”,如果没有,则使用...

安装gulp教程(整理)

所以安装nodejs。...

微信小程序生成带参数的二维码(小程序码)独家asp.net的服务端c#完整代码

1) 我第一次使用wx。小程序端请求调用API,发现这是一个坑!@-_~Page:'pages/index/index',//在此处填写要跳转到的小程序页面。你不能在它前面添加/oh。发布后必须为1024页//小程序代码的边长,以像素为单位,范围[2801280]},标头:{'content-type':“application/json;charset=U...