使用链接表时,使用LINQ连接和分组多个表

时间:2012-05-31 16:39:35

标签: c# linq linq-to-entities

我正在寻找关于如何在使用多个表的连接时获得第一条记录的最佳建议,如下所示。

我有三张桌子:

  • 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()

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

我希望从每个潜在客户记录的地址表(例如,最大ID)中获取一个属性并投影到模型:

select new LeadGridModel
        {
            ...
        });

示例:

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

1 个答案:

答案 0 :(得分:3)

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. 的地址
  3. 使用DefaultIfEmpty我们创建一个左连接。
  4. 请注意,由于SQL Server的限制,此模式会强制进行循环连接。对于小结果集,这通常不是问题。