LinqToSql - предотвращение вложенных запросов при ограничении числа возвращаемых строк - PullRequest
2 голосов
/ 16 сентября 2009
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-запрос, возвращающий поле «Теги». Если я удалю Take (100), один запрос будет отправлен на Sql Server.

Итак, как мне ограничить количество возвращаемых строк, не допуская при этом выполнения нового подзапроса для каждой строки?

1 Ответ

2 голосов
/ 16 сентября 2009

edit2 При работе с вложенными типами, например, с помощью 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. Просто выполните ToArray () после выполнения Take ().

edit Согласно этой теме SO: Существует ли LINQ-эквивалент строки. Join (string, string []) , невозможно использовать String.Join, если вы хочу сделать все на сервере, так как в TSQL для этого нет команды SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...