"Тип узла выражения 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 ответа:
вы пытаетесь передать произвольную функцию .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 пакет здесь.
все работает нормально теперь. :)