【问题标题】:How can I use a compound condition in a join in Linq?如何在 Linq 的联接中使用复合条件?
【发布时间】:2010-03-15 13:46:17
【问题描述】:

假设我有一个Customer 表,其中有一个PrimaryContactId 字段和一个SecondaryContactId 字段。这两个都是引用Contact 表的外键。对于任何给定的客户,可以存储一个或两个联系人。换句话说,PrimaryContactId 永远不可能是NULL,但SecondaryContactId 可以NULL

如果我将CustomerContact 表放到“Linq to SQL 类”设计图面上,类构建器将发现从Customer 表到Contact 表的两个FK 关系,依此类推生成的Customer 类将有一个Contact 字段和一个Contact1 字段(我可以将其重命名为PrimaryContactSecondaryContact 以避免混淆)。

现在假设我想获取一组给定客户的所有联系人的详细信息。

如果总是只有一个联系人,那么我可以这样写:

from customer in customers
join contact in contacts on customer.PrimaryContactId equals contact.id
select ...

...这将被翻译成类似:

SELECT ...
FROM Customer
INNER JOIN Contact
ON Customer.FirstSalesPersonId = Contact.id

但是,因为我想加入两个联系人字段,我希望 SQL 看起来像:

SELECT ...
FROM Customer
INNER JOIN Contact
ON Customer.FirstSalesPersonId = Contact.id OR Customer.SecondSalesPersonId = Contact.id

如何编写一个 Linq 表达式来做到这一点?

【问题讨论】:

  • INNER JOIN 不只是写WHERE 的不同方式吗?

标签: linq linq-to-sql


【解决方案1】:

It's rarely correct to use join in LINQ to SQL

既然您想要联系人,为什么不从那里开始您的选择呢?假设CustomerContact 之间的关联是双向的,您应该可以编写如下内容:

IEnumerable<Guid> customerIds = // ...

var q = from contact in Context.Contacts
        where customerIds.Contains(contact.Customer.Id)
        select contact;

【讨论】:

  • 如果您愿意,您也可以一口气完成所有操作。 (+1 链接文本,完全同意你的观点)
  • @Craig:这是另一种情况,在尝试简化我的问题并将其从我的问题域中取出时,我已经失去了我的情况的一些细微差别。我不认为我可以用另一种方式来解决它,不。但是,我同意你关于根本不使用 join 的观点。
【解决方案2】:

使用匿名类。 EG

new { A.Foo, B.Bar } equals new { Foo = B.Baz, Bar = C.Ork }

【讨论】:

  • 对不起,我认为你错过了问题的重点。这仍然是一个平等测试 - 我该如何做条件 1 或条件 2?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
相关资源
最近更新 更多