"Тип узла выражения LINQ 'Invoke' не поддерживается в LINQ to Entities " - stumped!


в моем 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 58

4 ответа:

вы пытаетесь передать произвольную функцию .NET... как Entity framework может надеяться перевести это в 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();
    }
}

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

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

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

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

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

можно назвать Expand() методом на до здесь запрос

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

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