使用LINQ在另一个SELECT上执行SELECT语句

时间:2017-06-02 10:25:23

标签: c# sql linq linq-to-sql asp.net-core

在我的.NET Core应用程序中,我在LINQ中有以下内容:

 return  await db.ApplicationUsers.Where(u=>u.Name.Contains(name) && !u.Deleted && u.AppearInSearch)
                                    .OrderByDescending(u => u.Verified)
                                    .Skip(page * recordsInPage)
                                    .Take(recordsInPage)
                                    .Select(u => new UserSearchResult()
                                    {
                                        Name = u.Name,
                                        Verified = u.Verified,
                                        PhotoURL = u.PhotoURL,
                                        UserID = u.Id,
                                        Subdomain = u.Subdomain
                                    }).ToListAsync();

转换为以下SQL:

 SELECT [t].[Name], [t].[Verified], 
        [t].[PhotoURL], [t].[Id], 
        [t].[Subdomain]  
 FROM 
      (SELECT [u0].*      
       FROM [AspNetUsers] AS [u0]      
       WHERE (((CHARINDEX('khaled', [u0].[Name]) > 0) OR ('khaled' = N''))
         AND ([u0].[Deleted] = 0)) 
         AND ([u0].[AppearInSearch] = 1)      
       ORDER BY [u0].[Verified] DESC      
       OFFSET 10 ROWS 
       FETCH NEXT 10 ROWS ONLY  ) AS [t]

但是由于性能问题,Microsoft支持建议我只查询固定长度的列(不是varchar(max))。我被要求将SQL查询更改为:

  SELECT [t].[Name], [t].[Verified], 
         [t].[PhotoURL] , [t].[Id], [t].[Subdomain]
  FROM 
        (Select u0.Name, u0.Verified, u0.PhotoURL, u0.id, u0.Subdomain,
             u0.Deleted, u0.AppearInSearch FROM [AspNetUsers] ) As [u0]
  WHERE (((CHARINDEX('khaled', [u0].[Name]) > 0) OR ('khaled' = N'')) 
    AND ([u0].[Deleted] = 0)) 
    AND ([u0].[AppearInSearch] = 1) 
  ORDER BY [u0].[Verified] DESC      
  OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY  ) AS [t]

另一个SELECT上的SELECT。不幸的是,我不知道如何在LINQ中做到这一点。有人可以指导我如何在LINQ中进行第二次SQL查询吗?

谢谢

2 个答案:

答案 0 :(得分:1)

首先构建内部选择:

var s1 = from u in db.AspNetUsers
          select new UserSearchResult
          {
              Name = u.Name,
              Verified = u.Verified,
              PhotoURL = u.PhotoURL,
              UserID = u.Id,
              Subdomain = u.Subdomain
         };

然后在外部选择中使用它:

 return  await (from u1 in s1 
                where u.Name.Contains(name) && !u.Deleted && u.AppearInSearch
                orderby u.Verified
                select u1)
                 .Skip(page * recordsInPage)
                 .Take(recordsInPage);

答案 1 :(得分:0)

当您选择查询.ToList()的输出时,输出再次是一个列表。在此列表中,您可以应用另一个.Select()。因此,与之前的查询一样,您可以这样做:

 return  await db.ApplicationUsers.Where(u=>u.Name.Contains(name) && !u.Deleted && u.AppearInSearch)
                                .OrderByDescending(u => u.Verified)
                                .Skip(page * recordsInPage)
                                .Take(recordsInPage)
                                .Select(u => new UserSearchResult()
                                {
                                    Name = u.Name,
                                    Verified = u.Verified,
                                    PhotoURL = u.PhotoURL,
                                    UserID = u.Id,
                                    Subdomain = u.Subdomain
                                })
                                .ToList()
                                .Select(<your new query>)
                                .ToListAsync();