Пользовательская функция в запросе Entity Framework иногда переводит правильно, иногда нет - PullRequest
2 голосов
/ 03 августа 2010

У меня есть эта функция:

public static IQueryable<Article> WhereArticleIsLive(this IQueryable<Article> q)
{
    return q.Where(x =>
        x != null
        && DateTime.UtcNow >= x.PublishTime
        && x.IsPublished
        && !x.IsDeleted);
}

И она прекрасно работает в этом запросе:

from a in Articles.WhereArticleIsLive()
where a.Id == 5
select new { a.Title }

Но она не работает в этом чуть более сложном запросе:

from s in Series
from a in Articles.WhereArticleIsLive()
where s.Id == a.SeriesId
select new { s, a }

Я получаю это сообщение об ошибке:

NotSupportedException: LINQ to Entities не распознает метод 'System.Linq.IQueryable 1[TheFraser.Data.Articles.Article] WhereArticleIsLive(System.Linq.IQueryable 1 [TheFraser.Data.Articles.Article]) ', и этот метод нельзя перевести в выражение магазина.

Есть идеи почему?Есть ли другой способ консолидации параметров запроса, подобных этому?

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

1 Ответ

3 голосов
/ 03 августа 2010

РЕДАКТИРОВАТЬ: исправления Крейг.

Я оставляю это здесь, потому что я думаю, что это ценный инструмент: используйте linqkit !Но не для решения этого вопроса: -)

Вместо того, чтобы возвращать IQueryable, используйте Expression для выделения предикатов.Например, вы можете определить следующий статический метод для Article:

public static Expression<Func<Article,bool>> IsLive()
{
    return x =>
    x != null
    && DateTime.UtcNow >= x.PublishTime
    && x.IsPublished
    && !x.IsDeleted
}

Затем убедитесь, что при создании запроса сохранена ссылка на это выражение, что-то вроде (не проверено):*

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