【问题标题】:Joining and grouping multiple tables with LINQ when using a linking table使用链接表时使用 LINQ 连接和分组多个表
【发布时间】:2012-06-01 00:51:56
【问题描述】:

我正在寻找一些关于在对多个表使用联接时如何最好地获取第一条记录的建议,如下所示。

我有三张桌子:

  • Leads
  • LeadAddresses(加入 表)
  • 地址

通常我会这样加入他们:

from t2
    in db.Leads
    .Where(o => t1.LeadId == o.Lead_ID)
from t4
    in db.LeadAddresses
    .Where(o => t2.Lead_ID == o.Lead_ID)
    .DefaultIfEmpty()
from t5
    in db.Addresses
    .Where(o => t4.Address_ID == o.Address_ID)
    .DefaultIfEmpty()

(如果这是不好的做法,请告诉我;)

我希望从 Addresses 表中获取每个 Lead 记录和项目到模型的属性(例如,具有最大 ID 的那个):

select new LeadGridModel
        {
            ...
        });

例子:

Lead Company | City    | ZIP
==============================
Company 1    | Boston  | 00000
Company 2    | Houston | 00001

【问题讨论】:

    标签: c# linq linq-to-entities


    【解决方案1】:
    from l in db.Leads
    from a in l.LeadAddresses.Select(la => la.Address).OrderByDescending(a => a.ID).Take(1).DefaultIfEmpty()
    select new { l, a }
    

    这可能看起来很棘手,但你会逐步理解它:

    1. OrderByDescendingTake(1) 结合使用,我们获取具有最大ID 的地址
    2. 我们使用 DefaultIfEmpty 创建左连接。

    请注意,由于 SQL Server 的限制,此模式会强制执行循环连接。对于小型结果集,这通常不是问题。

    【讨论】:

    • 感谢您的回复。这种情况下的问题是对象在数据库中没有关系,这就是我手动加入它们的原因。在这种情况下,我无法创建这些关系。
    • @Nick - 只需将 Select 替换为您的 Where
    • 只需将“l.LeadAddresses”替换为“db.LeadAddresses.Where(la => la.LeadID == l.ID)”,地址导航属性类似。
    猜你喜欢
    • 1970-01-01
    • 2016-03-04
    • 2021-02-25
    • 2017-09-19
    • 2017-05-02
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    相关资源
    最近更新 更多