gpt4 book ai didi

c# - 手动选择相关表数据(SELECT N+1问题)LINQ to SQL

转载 作者:太空狗 更新时间:2023-10-29 23:27:50 26 4
gpt4 key购买 nike

数据库示例:

图片 - ImageTag - 标签

图像可以有多个标签。关系建立得很好,但我遇到了性能问题。

我有许多不同的查询,它们根据不同的标准选择图像。它们工作正常,但这些查询未选择标签的数据。

这意味着如果我遍历 10 张图像的列表并尝试访问它们的标签对象(通过 ImageTag),那么我的数据库将针对每张图像执行一个新查询。

<%foreach (LINQRepositories.Image i in Model)
{ %>

<li><%=i.title%>
<ul>
<%foreach(ImageTag t in i.ImageTags){ %>
<li><%=t.Tag.name%></li>
<%} %>
</ul>
</li>

<%} %>

这显然不理想。有没有办法强制 LINQ to SQL 查询某些数据?

这是我的一个查询示例

public static IQueryable<Image> WithTags(this IQueryable<Image> qry, IEnumerable<Tag> tags)
{
return
from i in qry
from iTags in i.ImageTags
where tags.Contains(iTags.Tag)
select i;
}

编辑

尝试数据加载选项后,这是生成的示例查询

{SELECT [t0].[id], [t0].[title], [t0].[legend], [t0].[dateAdded], [t0].[deleted], [t0].[averageRating], [t0].[numberOfVotes], [t0].[imageOfTheWeek], [t0].[copyright], [t0].[copyrightText], [t0].[areaOfInterest], [t0].[typeId], [t0].[authorId], [t0].[editorialStatusId], [t0].[comments] FROM [dbo].[Image] AS [t0] CROSS JOIN ([dbo].[ImageTag] AS [t1] INNER JOIN [dbo].[Tag] AS [t2] ON [t2].[id] = [t1].[TagId]) WHERE ([t2].[id] = @p0) AND (NOT ([t0].[deleted] = 1)) AND (NOT ([t0].[deleted] = 1)) AND ([t1].[ImageId] = [t0].[id]) }

最佳答案

您可以使用 DataLoadOptions使用查询加载相关对象的类。

DataLoadOptions dlo = new DataLoadOptions();

dlo.LoadWith<Image>(image => image.ImageTags);
dlo.LoadWith<ImageTag>(imageTag => imageTag.Tags);

context.DataLoadOptions = dlo;

顺便提一下 - 这就是所谓的“SELECT N + 1 问题”

更新

我通常使用 LINQ to Entities,对 LINQ to SQL 的使用经验不多。可能需要禁用 DeferredLoadingEnabled也很明确。

context.DeferredLoadingEnabled = false;

关于c# - 手动选择相关表数据(SELECT N+1问题)LINQ to SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1298972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com