我有以下的SQL表。Linq2Sql如何編寫外部連接查詢?
ImportantMessages
impID
消息
ImportantMessageUsers
imuID
imuUserID
imuImpID
我想編寫一個Linq2Sql查詢,以便它返回ImportantMessagesUsers中沒有記錄的重要消息 中的任何行。
Matchiing字段 impID ----- imuImpID
假設的6
我有以下的SQL表。Linq2Sql如何編寫外部連接查詢?
ImportantMessages
impID
消息
ImportantMessageUsers
imuID
imuUserID
imuImpID
我想編寫一個Linq2Sql查詢,以便它返回ImportantMessagesUsers中沒有記錄的重要消息 中的任何行。
Matchiing字段 impID ----- imuImpID
假設的6
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通常更直觀易用。
檢出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
...
這是對我工作。
var qry = from imp in ImportantMessages
where !(from imu in ImportantMessagesUsers where imu.ImuUsrID == 6 select imu.ImuImpID).Contains(imp.ImpID)
select imp;
這是如何工作的?沒有添加用戶標準? – Malcolm 2010-04-10 10:07:39
我不認爲你會提出這個問題。 – Malcolm 2010-04-10 10:10:12
我認爲這個答案是正確的......它返回上下文中的所有行。Important重要消息在importantMessageUsers中相關的行數是0.但它只適用於有從foreignMessageUsers到ImportantMessages的外鍵。 (你應該有這個FK) – Jonathan 2010-04-10 10:22:08