(25)ASP.NET Core EF查询(复杂查询运算符、原生SQL查询、异步查询)
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子句。