2010-04-10 57 views
0

我有以下的SQL表。Linq2Sql如何編寫外部連接查詢?

ImportantMessages

impID

消息

ImportantMessageUsers

imuID

imuUserID

imuImpID

我想編寫一個Linq2Sql查詢,以便它返回ImportantMessagesUsers中沒有記錄的重要消息 中的任何行。

Matchiing字段 impID ----- imuImpID

假設的6

回答

2

imuUserID這將是一樣簡單

var messages = context.ImportantMessages.Where(x => x.ImportantMessageUsers.Count() == 0); 

編輯

我想我已經很好地理解了這個問題,您必須從沒有任何ro的重要消息表中獲取所有消息w位於ImportantMessageUsers表中,該表與外鍵連接ImportantMessagesUsers.imuImpID = ImportantMessages.impID。

請檢查這些表之間是否有外鍵,然後從Linq上下文設計器中刪除這些表並再次添加它們 - 外鍵應該在它們之間可見,從而創建諸如ImportantMessages.ImportantMessageUsers之類的屬性,這些屬性是IEnumerable鍵入ImportantMessageUser允許使用表達式像x.ImportantMessageUsers.Count()== 0

EDIT2

當用戶ID必須被過濾,這lambda表達式應該做的伎倆:

var messages = context.ImportantMessages.Where(x => x.ImportantMessageUsers.Where(y => y.imuUserID == 6).Count() == 0); 

使用基於LINQ表示法的lambda只是一個偏好問題,但是當不需要多個連接時,lambda通常更直觀易用。

+0

這是如何工作的?沒有添加用戶標準? – Malcolm 2010-04-10 10:07:39

+0

我不認爲你會提出這個問題。 – Malcolm 2010-04-10 10:10:12

+0

我認爲這個答案是正確的......它返回上下文中的所有行。Important重要消息在importantMessageUsers中相關的行數是0.但它只適用於有從foreignMessageUsers到ImportantMessages的外鍵。 (你應該有這個FK) – Jonathan 2010-04-10 10:22:08

1

檢出DefaultIfEmpty()。

這裏有一個例子從我老這麼一個問題:

LINQ to SQL - How to add a where clause to a left join?

var z = 
    from im in importantMessages 
    join imu in importantMessageUsers 
     on new { im.impID, imuUserID = 7 } equals 
     new { imu.imuImpID, imu.imuUserID } 
    into imJoin 
    from ij in imJoin.DefaultIfEmpty() 
    where ij.imuImpID == null 
    select new 
    { 
     im.Message 
     ... 
+0

我的問題是,即使閱讀了一些文檔後,我無法解決? – Malcolm 2010-04-10 10:22:11

+0

您還沒有考慮到用戶ID。 – Malcolm 2010-04-10 10:38:01

+0

我添加了一個示例。你有LinqPad嗎?通過將其用作暫存器更容易工作。有一個免費版本。 – Steve 2010-04-10 10:38:38

1

這是對我工作。

var qry = from imp in ImportantMessages 
where !(from imu in ImportantMessagesUsers where imu.ImuUsrID == 6 select imu.ImuImpID).Contains(imp.ImpID) 
select imp;