使用 OrderBy 和 GroupBy 从 SQL 创建 Linq

Creating Linq from SQL with OrderBy and GroupBy

我有以下 table 结构。

TableA      TableB          TableC
- MID       - PID           - PID
- NAME      - INIT_DATE     - MID

这是我需要转换成 Linq 的 SQL 查询

SELECT TOP 10 TableA.NAME, 
               COUNT(TableB.INIT_DATE) AS [TOTALCOUNT]
FROM TableC 
INNER JOIN TableA ON TableC.MID = TableA.MID 
LEFT OUTER JOIN TableB ON TableC.PID = TableB.PID
GROUP BY TableA.NAME
ORDER BY [TOTALCOUNT] DESC

我尝试使用此 Linq 查询重现上述查询:

iqModel = (from tableC in DB.TableC
           join tableA in DB.TableA on tableC.MID equals tableA.MID
           select new { tableC, tableA } into TM
           join tableB in DB.TableB on TM.tableC.PID equals J.PID into TJ
           from D in TJ.DefaultIfEmpty()
           select new { TM, D } into MD
           group MD by MD.TM.tableA.NAME into results
           let TOTALCOUNT = results.Select(item=>item.D.INIT_DATE).Count()
           orderby TOTALCOUNT descending
           select new SelectListItem
           {
               Text = results.Key.ToString(),
               Value = TOTALCOUNT.ToString()
            }).Take(10);

但我觉得我做错了什么。

LINQ 的输出与 SQL 不同。我认为 JOIN 或 GROUPBY 是正确的。

编辑:-

我也尝试了以下 Linq 查询,但仍然无法正常工作。

var iqModel = (from c in DB.TableC
               join a in DB.TableA on c.MID equals a.MID
               join b in DB.b on c.PID equals b.PID into b_join
               from b in b_join.DefaultIfEmpty()
               select new SelectListItem { Text = a.NAME, Value = b.INIT_DATE != null ? b.INIT_DATE.ToString() : string.Empty });

var igModel = iqModel.GroupBy(item => item.Text);

var result = igModel.OrderByDescending(item => item.Select(r => r.Value).Count());

我想了解我做错了什么以及如何解决。

我是 LINQ 的新手 SQL 我认为在上面的 LINQ 中我确实通过添加更多 select.

使它变得复杂

我假设您在结果查询中看不到“group by”命令,而是使用“distinct”命令.我说得对吗?

第一个查询通过 TableA.NAME 区分,然后在子查询的帮助下计算 COUNT(TableB.INIT_DATE):

select distinct1.Name, (select count() from *join query* where Name = distinct1.Name)
from (select distinct Name from *join query*) as distinct1

如果是这样,请不要担心。因为从 linq 到真正的 t-sql 脚本的转换有时非常不可预测(你不能强制它们相等,只有当查询非常简单时),但是两个查询是等价的并且 return 相同结果(比较它们以确保)。

我认为差异是由 SQL COUNT(field) 函数不包含 NULL 值这一事实造成的。 LINQ 中没有直接等效的构造,但可以用 Count(e => e.Field != null) 或像这样模拟(这似乎产生更好的 SQL):

var query = 
    (from a in db.TableA
     join c in db.TableC on a.MID equals c.MID
     join b in db.TableB on c.PID equals b.PID into joinB
     from b in joinB.DefaultIfEmpty()
     group b by a.Name into g
     let TOTALCOUNT = g.Sum(e => e.INIT_DATE != null ? 1 : 0)
     orderby TOTALCOUNT descending
     select new SelectListItem { Text = g.Key, Value = TOTALCOUNT }
    ).Take(10);

生成以下 SQL

SELECT TOP (10) 
    [Project1].[C2] AS [C1], 
    [Project1].[Name] AS [Name], 
    [Project1].[C1] AS [C2]
    FROM ( SELECT 
        [GroupBy1].[A1] AS [C1], 
        [GroupBy1].[K1] AS [Name], 
        1 AS [C2]
        FROM ( SELECT 
            [Join2].[K1] AS [K1], 
            SUM([Join2].[A1]) AS [A1]
            FROM ( SELECT 
                [Extent1].[Name] AS [K1], 
                CASE WHEN ([Extent3].[INIT_DATE] IS NOT NULL) THEN 1 ELSE 0 END AS [A1]
                FROM   [dbo].[TableAs] AS [Extent1]
                INNER JOIN [dbo].[TableCs] AS [Extent2] ON [Extent1].[MID] = [Extent2].[MID]
                LEFT OUTER JOIN [dbo].[TableBs] AS [Extent3] ON [Extent2].[PID] = [Extent3].[PID]
            )  AS [Join2]
            GROUP BY [K1]
        )  AS [GroupBy1]
    )  AS [Project1]
    ORDER BY [Project1].[C1] DESC