稍后在我的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();
    }
}

07-25 20:16