假设我有一个Customer
表,其中包含PrimaryContactId
字段和SecondaryContactId
字段。这两个都是引用Contact
表的外键。对于任何给定的客户,可以存储一个或两个联系人。换句话说,PrimaryContactId
永远不会是NULL
,但SecondaryContactId
可以为NULL
。
如果我将Customer
和Contact
表放到“Linq to SQL Classes”设计图面上,类构建器将发现从Customer
表到{的两个FK关系{1}}表,因此生成的Contact
类将包含Customer
字段和Contact
字段(我可以将其重命名为Contact1
和PrimaryContact
避免混淆)。
现在假设我想获得给定客户群的所有联系人的详细信息。
如果总有一个联系人那么我可以写一些类似的东西:
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表达式来执行此操作?
答案 0 :(得分:4)
It's rarely correct to use join
in LINQ to SQL。
既然你想要联系,为什么不在那里开始你的选择呢?假设Customer
和Contact
之间的关联是双向的,你应该能够写出如下内容:
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 }