Dim query = (From p in Parent _
select _
p.ID, _
Tags = String.Join("|", p.Child.Select(Function(c) c.Tag.TagName).ToArray)).Take(100)
在上面的查询中,当使用 Take 限制返回的行数时,对每一行执行单独的 SQL 查询以返回 'Tags' 字段。如果我删除 Take(100),一个发送到 SQL Server 的查询。
那么,如何限制返回的行数,同时防止为每一行执行新的子查询?
最佳答案
编辑2 使用嵌套类型时,执行 new { r, r.childrenCollection } 时,LINQ 将其转换为 (SELECT TOP 100 FROM r),删除连接信息。当你自己加入时,这不会发生。所以像这样:
var thingyWithChilds
= (from p in dc.RightCategories
join r in dc.Rights on p.Id equals r.CategoryId
select new { p.Id, r });
var bla = thingyWithChilds.Take(100);
不会造成同样的问题。
其他可能适用的内容
您执行的 ToArray() 会导致查询执行,因为它不是 IQueryable。在执行 Take() 之后执行 ToArray()。
编辑 根据这个 SO 主题:Is there a LINQ equivalent of string.Join(string, string[]) , 如果您想在服务器上执行所有操作,则不可能使用 String.Join,因为在 TSQL 中没有可用于执行此操作的 SQL 命令。
关于c# - Linq To Sql - 在限制返回的行数时防止子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1431695/