Данный LINQ к Объектам не поддерживает “Пользовательские методы”, как Вы остаетесь DRY?

Я столкнулся с этой проблемой:

Пользовательские методы и Дополнительные Методы не могут быть переведены в выражение хранилища

В основном я имею, некоторые усложнили запросы LINQ, так требуемый для разламывания их на подзапрашивает, которые реализованы как методы тот возврат IQueryables. Моя надежда была затем этими IQueryables, мог быть составлен вместе в операторе LINQ (поскольку я вполне уверен, можно сделать в LINQ к SQL).

Проблема состоит в том при попытке этого, Вы добираетесь (например):

LINQ к Объектам не распознает метод 'Система. Linq. IQueryable '1 [Поток] GetThreadsByMostReccentlyPosted (Int32)' метод и этот метод не может быть переведен в выражение хранилища.

Для меня кажется довольно существенным, что при использовании LINQ ORM затем, необходимо смочь составить запросы LINQ. Иначе любая общая логика запроса должна быть копией и вставляемый.

Учитывая это ограничение, как я, как предполагается, остаюсь DRY с LINQ к Объектам?

8
задан Jack Ukleja 11 January 2010 в 15:16
поделиться

2 ответа

Два пути:

  1. Методы, которые возвращают выражения, могут использоваться
  2. , Отделите queryable и счетные биты

Для № 1, рассмотрите:

public Expression<Func<Foo, bool>> WhereCreatorIsAdministrator()
{
    return f => f.Creator.UserName.Equals("Administrator", StringComparison.OrdinalIgnoreCase);
}

public void DoStuff()
{
    var exp = WhereCreatorIsAdministrator();
    using (var c = new MyEntities())
    {
        var q = c.Foos.Where(exp); // supported in L2E
        // do stuff
    }
 }

Для примера номера 2, прочитайте эту статью: , Как составить L2O и вопросы L2E . Рассмотрим приведенный здесь пример:

var partialFilter = from p in ctx.People
                    where p.Address.City == “Sammamish”
                    select p;

var possibleBuyers = from p in partiallyFilter.AsEnumerable()
                     where InMarketForAHouse(p);
                     select p;

Это может быть менее эффективным, или это может быть хорошо. Это зависит от того, что ты делаешь. Обычно это нормально для проекций, часто не подходит для ограничений.

Обновить Только что увидел еще лучшее объяснение опции # 1 от Damien Guard.

12
ответ дан 5 December 2019 в 14:03
поделиться

EF не может составить запрос из выражения LINQ, который включает в себя метод. EF нуждается в буквальных ценностях, чтобы составить SQL.

Вам придется делать с «общими» запросами, которые возвращают суперсета объектов, которые вам нужны в данном случае, затем используйте методы расширения и LINQ, чтобы сузить набор возврата, когда он был возвращен из базы данных.

0
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: