Ограничивающие запросы, основанные на совокупностях свойств ассоциаций - PullRequest
2 голосов
/ 13 июля 2010

Быстрый вопрос: будет ли это вызывать один запрос для каждого элемента тега?

public static IQueryable<Tag> WhereTagHasLivePosts(this IQueryable<Tag> q)
{
    return q.Where(t => t.Posts.Where(p => DateTime.Now >= p.PublishTime && p.IsPublished == true).Count() > 0);
}

t.Posts.Where на самом деле расширение для IEnumerable, а не IQueryable, так что кажется, что это может быть не очень хорошая идея.

Заранее спасибо,

Rei

1 Ответ

0 голосов
/ 13 июля 2010

Вы совершенно правы - t.Posts - это EntityCollection (в Linq-to-SQL это будет EntitySet), и как таковой реализует IEnumerable, а не IQueryable.

Хотя поток был о Linq-to-SQL, это та же логика, что и здесь:

http://damieng.com/blog/2009/06/01/linq-to-sql-changes-in-net-40

Микеон говорит:

[...] EntitySet, который НЕ IQueryable.

Это предотвращает использование linq2sql в любом реальном сценарии.

Рассмотрим:

client.Orders.Where (о => o.Total> 1000); // запускает linq для объектов, а не linq для sql

Та же проблема существует в entiy framework.

Дэмиен отвечает:

@ Mikeon: EntitySet загружен коллекция в памяти для отношения.

Если вы хотите, чтобы все заказы на конкретный клиент, где общая сумма больше 100, тогда вы выполняете:

db.Orders.Where (o => o.Client == клиент && o.Total> 1000)

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