美文网首页
EF Core 备忘

EF Core 备忘

作者: methodname | 来源:发表于2019-05-15 13:14 被阅读0次
    efcore-1.png
    1. 模糊查询
      sql
    SELECT * from A
    WHERE A.字段x like '%条件内容x%'
    

    linq

    var list = (from a in context.A
                where a.字段x.Contains("条件内容x")
                select new
                {
                     a.字段
                }).AsNoTracking().ToList();
    
    1. 内连接查询
      sql
    SELECT * from A
    inner JOIN B 
    ON A.字段1 = B.字段1
    WHERE A.字段x = '条件内容x'
    and B.字段x = '条件内容x'
    

    linq

    var list = (from a in context.A
                join b in context.B
                on a.字段1 equals b.字段1
                where a.字段x == "条件内容x"
                && b.字段x == "条件内容x"
                select new
                {
                     a.字段,
                     b.字段
                }).AsNoTracking().ToList();
    
    1. 左连接查询
      sql
    SELECT * from A
    left JOIN B 
    ON A.字段1 = B.字段1
    WHERE A.字段x = '条件内容x'
    

    linq

    var list = (from a in context.A
                join b in context.B
                on a.字段1 equals b.字段1 into ab
                from abl in ab.DefaultIfEmpty()
                where a.字段x == "条件内容x"
                select new
                {
                     a.字段,
                     b.字段
                }).AsNoTracking().ToList();
    
    1. 左连接查询(连接内带条件)
      sql
    SELECT * from A
    left JOIN B 
    ON A.字段1 = B.字段1 
    and A.字段2 = '条件内容1' 
    and A.字段3 = '条件内容2'
    WHERE A.字段x = '条件内容x'
    

    linq

    var list = (from a in context.A
                join b in context.B
                on a.字段1 equals b.字段1
                .Where(b1=>b1.字段2 == "条件内容2" && b1.字段3 == "条件内容3")
                into ab
                from abl in ab.DefaultIfEmpty()
                where a.字段x == "条件内容x"
                select new
                {
                    a.字段,
                    b.字段
                }).AsNoTracking().ToList();
    
    1. 递归查询
      表结构

    ID PID XXX
    1 1 大哥
    2 1 二哥
    3 2 三弟
    pid和id是同一张表中的主外键关系,常见的一种的上下级表结构设计,如果需要再linq里面进行查询id为1的所有子级列表就需要用到关键词SelectMany

    /// <summary>
    /// 向下递归获取子级ID
    /// </summary>
    /// <param name="pId"></param>
    /// <returns></returns>
    private List<uint> GetSonId(uint pId)
    {
        using (var context = new DBContext())
        {
            var ps = (from p in context.表名
                    select new
                    {
                        p.id,
                        p.pid
                    }).AsNoTracking().ToList();
            if (ps.Any())
            {
                var query = (from c in 表名
                                where c.pid == pId
                                select c.id).ToList();
                return query.Concat(query.SelectMany(GetSonId)).ToList();
            }
            else
            {
                return new List<uint>();
            }
        }
    }
    
    1. 获取EF SaveChanges前未提交到数据库中的数据
      此处的适用场景为批量添加存在主外键关联的数据,过程中需要判断外键数据是否已经存在,如果每条数据每次都saveChanges到数据库,然后再从数据库中去查询外键数据是否存在,将耗费很长的时间,在本地将Add过的外键数据取出,直接在本地判断将极大的提高程序的效率。
    using (var context = new DBContext())
    {
        var localList = context.Entity.Local;
    }
    

    相关文章

      网友评论

          本文标题:EF Core 备忘

          本文链接:https://www.haomeiwen.com/subject/wxrpaqtx.html