稍后在我的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();
}
}
但是,我得到上述错误。似乎我通过从函数构建谓词来使所有事情都正确。有任何想法吗?谢谢。
最佳答案
您正在尝试在...中传递任意.NET函数。 Entity Framework 如何希望将其转换为SQL?您可以将其更改为采用Expression<Func<int, bool>>
,然后从中构建Where
子句,尽管这并不是特别容易,因为您需要使用其他参数表达式重写表达式(即,替换参数中的任何参数表达式)带有调用u.RelationTypeId
的表达式的原始表达式树)。
老实说,为了只在用于创建表达式树以传递到方法中的lambda表达式中指定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();
}
}