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。
那么,如何限制返回的行数,同时阻止为每一行执行新的子查询?
答案 0 :(得分:2)
<强> EDIT2 强> 当使用嵌套类型时,所以做新的{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,因为没有可用的SQL命令在TSQL中做到这一点。