2020-05-14 - Linq 查询

2020-06-11  本文已影响0人  daiwei_9b9c

https://docs.microsoft.com/zh-cn/ef/core/querying/

var query = from photo in context.Set<PersonPhoto>()
                    join person in context.Set<Person>() on photo.PersonPhotoId equals person.PhotoId
                   select new { person, photo }

a. 不引用外部条件 -- 两个数据源的笛卡尔乘积
使用 cross join 关联2个表, 没有关联条件

var query = from b in context.Set<Blog>()
                  from p in context.Set<Post>()
                  select new { b, p }

b. 引用 where 子句中的外部
下面将使用 inner join 关联2个表

var query = from b in context.Set<Blog>()
            from p in context.Set<Post>().Where(p => b.BlogId == p.BlogId)
            select new { b, p };

下面使用了 DeaultIfEmpty(), 将使用 left join 关联2个表

var query2 = from b in context.Set<Blog>()
             from p in context.Set<Post>().Where(p => b.BlogId == p.BlogId).DefaultIfEmpty()
             select new { b, p };

c. 引用非 where 情况下的外部
使用 Cross Join, 即 Post 无记录时, 无结果返回;

var query = from b in context.Set<Blog>()
            from p in context.Set<Post>().Select(p => b.Url + "=>" + p.Title)
            select new { b, p };

下面使用了 Outer Apply, 也没有关联条件,
但是可以支持 left join 类似语法, 即 Post 无记录时, 也可能有记录返回

var query2 = from b in context.Set<Blog>()
             from p in context.Set<Post>().Select(p => b.Url + "=>" + p.Title).DefaultIfEmpty()
             select new { b, p };

GroupBy 运算符创建 IGrouping<TKey, TElement> 类型的结果, 由于任何数据库结构都无法表示 IGrouping,
聚合运算符应用于返回标量的每个组时,该运算符可在关系数据库中转换为 SQL GROUP BY
SQL GROUP BY 也会受到限制。 它要求只按标量值进行分组。
因此, 投影只能包含分组键列或对列应用的任何聚合
聚合运算符: Avg, Count, LongCount, Min, Max, Sum
注意下面的 group by 和 最后一个的 select , 只按标量值分组, 投影只包含分组健 和 聚合运算函数

var query = from p in context.Set<Post>() group p by p.AuthorId into g
             select new { g.Key,  Count = g.Count() };

分组后的聚合运算符 ( 即 into g 中的 g ) 出现在 Where 或 OrderBy(或其他排序方式)LINQ 运算符中。
它在 SQL 中将 HAVING 子句用于 where 子句。

var query = from p in context.Set<Post>() group p by p.AuthorId into g
                  where g.Count() > 0   orderby g.Key
                  select new { g.Key,  Count = g.Count() };;

注意, LeftJoin 的写法,
join 后 Into 到一个别名1中, 然后 from 别名2 in 别名1.DefaultIfEmpty()

var query = from b in context.Set<Blog>()
                  join p in context.Set<Post>() on b.BlogId equals p.BlogId into grouping
                 from p in grouping.DefaultIfEmpty()
                  select new { b, p };```
上一篇下一篇

猜你喜欢

热点阅读