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