2010-03-15 52 views
1

比方說,我有一個Customer表,其中有一個PrimaryContactId字段和一個SecondaryContactId字段。這兩個都是引用Contact表的外鍵。對於任何給定的客戶,可以存儲一個或兩個聯繫人。換句話說,PrimaryContactId永遠不可能是NULL,但是SecondaryContactId可以是NULL如何在Linq的連接中使用複合條件?

如果我放棄我的CustomerContact表到「LINQ to SQL類」設計圖面,類生成器將當場從Customer表兩個FK關係到Contact表,並因此產生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表達式來做到這一點?

+0

不是'INNER JOIN'不同的只是寫'WHERE'的方式嗎? – leppie 2010-03-15 13:50:08

回答

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; 
+0

如果你願意,你也可以一舉成功。 (對鏈接文本+1,完全同意你的觀點) – leppie 2010-03-15 14:17:52

+0

@Craig:這是另一種情況,在試圖簡化我的問題並將其從問題域中解脫出來時,我已經失去了一些我的情況的細微差別。我不認爲我可以用另一種方式來解決它,不。但是,我關於不使用連接的觀點。 – 2010-03-18 11:37:51

1

使用匿名類。 EG

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

對不起,我想你已經錯過了這個問題的關鍵。這仍然是一個平等測試 - 我怎麼能做condition1 OR condition2? – 2010-03-15 14:14:08

+0

查看我的評論。 – leppie 2010-03-15 14:15:16