【问题标题】:Joining two tables in linq method syntax, MVC EntityFramework在 linq 方法语法中连接两个表,MVC EntityFramework
【发布时间】:2012-10-27 00:19:16
【问题描述】:

我正在处理两个表:CI_CLIENTRISK(SCD 类型 2)...和 ​​QB_INVOICES_HEADER (edmx screenshot)。

他们可以通过 ClientID 加入。我想基本上复制这个查询:

SELECT a.ClientID,
    MAX(b.InvoiceDt) AS MaxInvoiceDt
    (omitted for brevity)
FROM CI_CLIENTRISKADJS a
INNER JOIN QB_INVOICES_HEADER b
ON a.ClientID = b.ClientID
WHERE a.IsActive = 1
GROUP BY a.ClientID
ORDER BY MaxInvoiceDt DESC

这是我目前所拥有的。它没有返回任何记录。

using (var db = new PLOGITENS01Entities())
        {
        var rvClientRiskAdjs = db.CI_CLIENTRISKADJS
            .Take(50)
            .Join(db.QB_INVOICES_HEADER,
                a => a.ClientID,
                b => b.ClientID,
                (a, b) => new { Risk = a, Invoices = b })
            .Where(a => a.Risk.IsActive == 1)
            .OrderByDescending(o => o.Invoices.InvoiceDt)
            .Select(c => new ClientRiskModel()
            {
                ClientRiskId = c.Risk.ClientRiskID,
                ClientName = c.Risk.CI_CLIENTLIST.ClientName,
                ClientId = c.Risk.ClientID,
                ClientRiskAdjs = c.Risk.ClientRiskAdjs,
                RecordValidStartDt = c.Risk.RecordValidStartDt,
                RecordValidEnddt = c.Risk.RecordValidEnddt,
                IsActive = c.Risk.IsActive
            })
            .ToList();

        return View(new GridModel(rvClientRiskAdjs));
        }

【问题讨论】:

    标签: c# sql asp.net-mvc entity-framework linq


    【解决方案1】:

    尝试将 .Take(50) 方法放在最终的 .Select 之后和 .ToList() 之前。实际上,您只获取第一个表的前 50 条记录,然后从那里加入。我假设在第一个表的前 50 条记录中没有连接到第二个表;因此,您的结果将有 0 条记录。

    【讨论】:

    • 感谢您的提示。 :) 这行得通,但它没有考虑 Max 聚合(在 SQL 查询的第二行中找到)。它返回所有客户端 ID 的列表,没有组。我最终通过这篇文章偶然发现了答案:stackoverflow.com/a/157919/1689144
    【解决方案2】:

    我在阅读这篇文章时偶然发现了这个解决方案:https://stackoverflow.com/a/157919/1689144

    var rvClientRiskAdjs = (from ri in db.CI_CLIENTRISKADJS
                            join qb in
                                (from qb in db.QB_INVOICES_HEADER
                                 orderby qb.InvoiceDt ascending
                                 group qb by qb.ClientID into grp
                                 select new
                                 {
                                     InvoiceDt = grp.Max(s => s.InvoiceDt),
                                     ClientID = grp.Key
                                 })
                            on ri.ClientID equals qb.ClientID
                            orderby qb.InvoiceDt descending
                            where ri.IsActive == 1
                            select new ClientRiskModel()
                            {
                                ClientRiskId = ri.ClientRiskID,
                                ClientName = ri.CI_CLIENTLIST.ClientName,
                                ClientId = ri.ClientID,
                                ClientRiskAdjs = ri.ClientRiskAdjs,
                                RecordValidEnddt = ri.RecordValidEnddt,
                                RecordValidStartDt = ri.RecordValidStartDt
                            })
                            .ToList();
    

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多