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

qui*_*qui 5 c# linq performance linq-to-sql

数据库示例:

图像 - 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> 

<%} %>
Run Code Online (Sandbox Code Playgroud)

这显然不太理想.有没有办法强制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;
}
Run Code Online (Sandbox Code Playgroud)

编辑

尝试dataload选项后,这是一个生成的示例查询

{SELECT [t0].[id],[t0].[title],[t0].[legend],[t0].[dateAdded],[t0].[删除],[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].[删除] ] = 1))AND(NOT([t0].[删除] = 1))AND([t1].[ImageId] = [t0].[id])}

Ste*_*McD 0

为什么不尝试这样的事情:

return
        from i in qry
        from iTags in i.ImageTags
        where tags.Contains(iTags.Tag)
        select new { TagName = i.Tag.name };
Run Code Online (Sandbox Code Playgroud)

这将返回一个仅包含标签名称的集合。我希望我在这里能正确理解你的问题。希望能帮助到你