1.复杂查询运算符

在生产场景中,我们经常用到LINQ运算符进行查询获取数据,现在我们就来了解下生产场景经常出现几种复杂查询运算符。

1.1联接(INNER JOIN)

借助LINQ Join运算符,可根据每个源的键选择器连接两个数据源,并在键匹配时生成值的元组。

复制代码
var query = from blog in _context.Set<Blog>()             join post in _context.Set<Post>()                 on blog.BlogId equals post.BlogId             select new { blog, post };
复制代码

SQL:

复制代码
SELECT [blog].[BlogId], [blog].[Createtime], [blog].[Updatetime], [blog].[Url], [post].[PostId], [post].[BlogId], [post].[Content], [post].[Title] FROM [Blog] AS [blog] INNER JOIN [Post] AS [post] ON [blog].[BlogId] = [post].[BlogId]
复制代码

SQL Server Profiler:

1.2左联接(Left Join)

虽然Left Join不是LINQ运算符,但关系数据库具有常用于查询的Left Join的概念。LINQ查询中的特定模式提供与服务器上的LEFT JOIN相同的结果。

复制代码
var query = from blog in _context.Set<Blog>()             join post in _context.Set<Post>()                 on blog.BlogId equals post.BlogId into grouping             from post in grouping.DefaultIfEmpty()             select new { blog, post };
复制代码

SQL:

复制代码
SELECT [blog].[BlogId], [blog].[Createtime], [blog].[Updatetime], [blog].[Url], [post].[PostId], [post].[BlogId], [post].[Content], [post].[Title] FROM [Blog] AS [blog] LEFT JOIN [Post] AS [post] ON [blog].[BlogId] = [post].[BlogId]
复制代码

SQL Server Profiler:

1.3分组(GroupBy)

LINQ GroupBy运算符创建IGrouping<TKey, TElement>类型的结果,其中TKey和TElement可以是任意类型。此外,IGrouping实现了IEnumerable<TElement>,这意味着可在分组后使用任意LINQ运算符来对其进行组合。

复制代码
var query = from blog in _context.Set<Blog>()             group blog by blog.Url into g             select new             {                 g.Key,                 Count = g.Count()             };
复制代码

SQL:

复制代码
SELECT [blog].[Url] AS [Key], COUNT(*) AS [Count] FROM [Blog] AS [blog] GROUP BY [blog].[Url]
复制代码

SQL Server Profiler:


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