2KLE:謝謝,我知道了。這個查詢的結果是每個標籤一行(項目數據被複制),所以無論如何需要處理應用程序代碼中的結果集。我對嗎?
對於LINQ 2 SQL我使用DataLoadOptions來指定要加載的關聯數據。這裏是LINQ2SQL生成的代碼示例,用於選擇包含所有標籤的所有項目。
請注意在我的示例中Items表稱爲Snippets(所以我們有Snippets,Tags和SnippetsTags表)。另外需要注意的是,LINQ2SQL不支持開箱即用的多對多關係,所以有一箇中間表(SnippetsTag)的實體類。下面是C#代碼:
using (SnippetsDataContext context = UtilsLinq.CreateContext())
{
DataLoadOptions dl = new DataLoadOptions();
dl.LoadWith<Snippet>(s => s.SnippetsTags);
dl.LoadWith<SnippetsTag>(st => st.Tag);
context.LoadOptions = dl;
var result = (from s in context.Snippets
select s).ToList();
string x = result.First().SnippetsTags.First().Tag.Title;
}
這裏是一個的LINQ to SQL生成SQL:
SELECT [t0].[Id], [t0].[Title], [t0].[Text], [t0].[Created], [t1].[Id] AS [Id2], [t1].[TagId], [t1].[SnippetId], [t2].[Id] AS [Id3], [t2].[Title] AS [Title2], (
SELECT COUNT(*)
FROM [dbo].[SnippetsTags] AS [t3]
INNER JOIN [dbo].[Tags] AS [t4] ON [t4].[Id] = [t3].[TagId]
WHERE [t3].[SnippetId] = [t0].[Id]
) AS [value]
FROM [dbo].[Snippets] AS [t0]
LEFT OUTER JOIN ([dbo].[SnippetsTags] AS [t1]
INNER JOIN [dbo].[Tags] AS [t2] ON [t2].[Id] = [t1].[TagId]) ON [t1].[SnippetId] = [t0].[Id]
ORDER BY [t0].[Id], [t1].[Id], [t2].[Id]
感謝您詳細的答覆!你能分享這個視圖的僞代碼嗎?計算列是否應對標記表上的每一行執行相關子查詢?在性能方面可以接受嗎? 謝謝! – artvolk 2009-09-06 20:01:23
你使用了哪個數據庫?我不熟悉LINQ。我相信查詢可以被構建爲使用JOIN而不是相關的查詢。 – 2009-09-06 20:19:24