我想弄清楚如何在LINQ中進行混合連接,並對2個LINQ對象進行特定的訪問。下面是實際的TSQL查詢可能外觀的示例:幫助LINQ:混合連接並指定默認值
SELECT
*
FROM
[User] AS [a]
INNER JOIN
[GroupUser] AS [b]
ON
[a].[UserID] = [b].[UserID]
INNER JOIN
[Group] AS [c]
ON
[b].[GroupID] = [c].[GroupID]
LEFT JOIN
[GroupEntries] AS [d]
ON
[a].[GroupID] = [d].[GroupID]
WHERE [a].[UserID] = @UserID
最後,基本上是我想是一個枚舉對象全GroupEntry對象。什麼是感興趣的是這個查詢中的最後兩個表/對象。我將顯示組作爲組標題,以及組標題下的所有條目。如果組中沒有條目,我仍然希望將該組看作沒有任何條目的標題。這是我到目前爲止有:
所以從這一點我想提出一個功能:
public void DisplayEntriesByUser(int user_id)
{
MyDataContext db = new MyDataContext();
IEnumberable<GroupEntries> entries =
(
from user in db.Users
where user.UserID == user_id
join group_user in db.GroupUsers
on user.UserID = group_user.UserID
into a
from join1 in a
join group in db.Groups
on join1.GroupID equals group.GroupID
into b
from join2 in b
join entry in db.Entries.DefaultIfEmpty()
on join2.GroupID equals entry.GroupID
select entry
);
Group last_group_id = 0;
foreach(GroupEntry entry in entries)
{
if (last_group_id == 0 || entry.GroupID != last_group_id)
{
last_group_id = entry.GroupID;
System.Console.WriteLine("---{0}---", entry.Group.GroupName.ToString().ToUpper());
}
if (entry.EntryID)
{
System.Console.WriteLine(" {0}: {1}", entry.Title, entry.Text);
}
}
}
上面的例子並沒有完全達到預期效果。有2個問題,我一直沒能解決:
我似乎仍然得到一個INNER JOIN代替LEFT JOIN在最後加入。我沒有收到任何空的結果,所以沒有條目的組不會出現。
我需要找出一種方法,以便我可以填寫空白條目集的默認值。也就是說,如果有一個沒有條目的組,我希望返回一個大部分空白的條目,除了我希望EntryID爲null或0,GroupID是它所代表的空組的組,我需要一個處理entry.Group對象(即它是父對象,空Group對象)。
對此的任何幫助將不勝感激。
注意:表名和真實世界的表示法純粹是爲了這個例子而衍生的,但它們的關係簡化了我想要做的事情。
非常感謝丹。這是一個更直接的查詢。後面的代碼稍後會陷入一些麻煩。我當前的函數需要一個IEnumberable對象類型,通過它可以迭代。現在,在我的foreach循環中,在查詢之後,我得到了「用於查詢運算符'DefaultEmpty'的不支持的重載」錯誤。 在好奇心相關的一面,如果你在linq中使用「into」關鍵字,它是否必須在下面的db層創建一個子查詢? –
2010-05-30 17:04:19
Corey,這是一個LinqToSql查詢嗎? – devuxer 2010-05-30 21:52:28
Yessir。底層數據庫是MSSQL 2005服務器。 – 2010-05-30 22:43:41