«Тип узла выражения LINQ 'Invoke' не поддерживается в LINQ to Entities" - озадачен! - PullRequest
62 голосов
/ 12 марта 2011

В моем EF позже я пытаюсь передать анонимную функцию, которая будет использоваться как часть моего запроса Linq.Функция передаст INT и вернет BOOL (u.RelationTypeId - INT).Ниже приведена упрощенная версия моей функции:

public IEnumerable<UserBandRelation> GetBandRelationsByUser(Func<int, bool> relation)
{
    using (var ctx = new OpenGroovesEntities())
    {
        Expression<Func<UsersBand, bool>> predicate = (u) => relation(u.RelationTypeId);

        var relations = ctx.UsersBands.Where(predicate);

        // mapping, other stuff, back to business layer
        return relations.ToList();
    }
}

Однако я получаю ошибку, указанную выше.Кажется, я все делаю правильно, создавая предикат из функции.Есть идеи?Спасибо.

Ответы [ 4 ]

115 голосов
/ 03 июля 2012

Я получил именно эту ошибку, и я использую Entity Framework с PredicateBuilder Джо Албахари для создания динамических where предложений. Если вы оказались в таком же состоянии, вам следует вызвать метод AsExpandable:

При запросе с Entity Framework измените последнюю строку на эту:

return objectContext.Products.AsExpandable().Where(predicate);

Этот метод является частью библиотеки LINQKIT DLL, которую вы можете получить здесь или через пакет NuGet здесь .

Теперь все работает нормально. :)

47 голосов
/ 12 марта 2011

Вы пытаетесь передать произвольную функцию .NET в ... как структура сущностей может надеяться перевести это в SQL? Вы можете изменить его, взяв вместо него Expression<Func<int, bool>>, и построить из него предложение Where, хотя это не будет особенно просто, потому что вам нужно будет переписать выражение с другим параметром выражение (т. е. замена любого выражения параметра в исходном дереве выражений на выражение вызова u.RelationTypeId).

Если честно, просто указав u.RelationTypeId в лямбда-выражении, которое вы используете для создания дерева выражений для передачи в метод, вам лучше использовать:

public IEnumerable<UserBandRelation> GetBandRelationsByUser(
    Expression<Func<UsersBand, bool>> predicate)
{
    using (var ctx = new OpenGroovesEntities())
    {
        var relations = ctx.UsersBands.Where(predicate);

        // mapping, other stuff, back to business layer
        return relations.ToList();
    }
}
3 голосов
/ 26 октября 2015

Вы можете вызвать Expand () метод для вашего предиката до , где запрос

0 голосов
/ 10 мая 2013

Я знаю, что этот ответ действительно поздно, но я столкнулся с той же проблемой, и это привело меня сюда, поэтому я решил поделиться своим решением.

Я прочитал ответ Лениэля, и он дал мнеидея.Типы по умолчанию имеют метод «AsEnumerable ()», который ведет себя так же, облегчая проблему.

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