无法从Expression <Func <实体,bool>>转换为Func <实体,bool>

时间:2018-09-22 05:25:03

标签: c# linq

我的代码中具有此功能:

public virtual bool Exists<ENTITY>(Expression<Func<ENTITY, bool>> expr)
{
    return this._dbSet.Count(expr) > 0;
}

我收到错误

  

无法将System.Linq.Expressions.Expression >转换为   System.Func

现在我是否可以将功能更改为此:

public virtual bool Exists<ENTITY>(Expression<Func<ENTITY, bool>> expr)
{
    var tmp = expr.Compile();
    return this._dbSet.Count(tmp) > 0;
}

我遇到另一个错误:

  

无法将System.Func 转换为   System.Linq.Expressions.Expression >

我在做什么错或者编译器发疯了?我正在使用VS2017 C#7.1

2 个答案:

答案 0 :(得分:1)

您没有发布完整的代码,所以我在这里猜测:

您的已经通用的,带有参数ENTITY。因此,删除<ENTITY>中的Exists<ENTITY>,因为这意味着您的方法是通用的且不同于类。但是它必须与类和您的DbSet相同,是通用参数,因此只需使用该类的通用参数即可。

class Repository<ENTITY>
{
    public virtual bool Exists(Expression<Func<ENTITY, bool>> expr)
    {
        return this._dbSet.Count(expr) > 0;
    }
}

旁注:EXISTS可能是.Any(),而不是.Count() > 0

答案 1 :(得分:1)

假设,您要对_dbSet中满足谓词的实体进行计数-以便在编译后检查是否有任何元素表达式树

var tmp = expr.Compile();

您应该添加以下内容:return this._dbSet.Where(entity => tmp(entity).Count() > 0;

更新

正如nvoigt在他的回答中指出的那样,使用Any方法更合乎逻辑:

return this._dbSet.Any(entity => tmp(entity));