如何在Linq的连接中使用复合条件?

时间:2010-03-15 13:46:18

标签: linq linq-to-sql

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

如果我将CustomerContact表放到“Linq to SQL Classes”设计图面上,类构建器将发现从Customer表到{的两个FK关系{1}}表,因此生成的Contact类将包含Customer字段和Contact字段(我可以将其重命名为Contact1PrimaryContact避免混淆)。

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

如果总有一个联系人那么我可以写一些类似的东西:

SecondaryContact

...将被翻译成类似的东西:

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

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

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

如何编写Linq表达式来执行此操作?

2 个答案:

答案 0 :(得分:4)

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 :(得分:1)

使用匿名类。 EG

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