Учитывая, что LINQ to Entities не поддерживает «Пользовательские методы», как вы остаетесь сухим? - PullRequest
8 голосов
/ 11 января 2010

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

Пользовательские методы и методы расширения не могут быть преобразованы в выражение магазина

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

Проблема в том, что если вы попробуете это, вы получите (например):

LINQ to Entities не распознает метод «System.Linq.IQueryable`1 [Тема] GetThreadsByMostReccentlyPosted (Int32)» метод, и этот метод не может быть переведено в магазинное выражение.

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

Учитывая это ограничение, как я должен оставаться СУХИМ с LINQ to Entities?

Ответы [ 2 ]

12 голосов
/ 11 января 2010

Два способа:

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

Для № 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 от Дэмиена Стража.

0 голосов
/ 11 января 2010

EF не может составить запрос из выражения LINQ, содержащего метод. EF нужны литеральные значения для составления SQL.

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

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