LinqToSql - 在限制返回的行数时阻止子查询

时间:2009-09-16 08:31:18

标签: c# .net vb.net linq-to-sql

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。

那么,如何限制返回的行数,同时阻止为每一行执行新的子查询?

1 个答案:

答案 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中做到这一点。