C# 无法从表达式转换<;Func<;实体,bool>&燃气轮机;to Func<;实体,bool>;

C# 无法从表达式转换<;Func<;实体,bool>&燃气轮机;to Func<;实体,bool>;,c#,linq,C#,Linq,我的代码中有此函数: public virtual bool Exists<ENTITY>(Expression<Func<ENTITY, bool>> expr) { return this._dbSet.Count(expr) > 0; } 存在公共虚拟bool(表达式expr) { 返回此值。_dbSet.Count(expr)>0; } 我得到了错误 无法将System.Linq.Expressions.Expression转换为 S

我的代码中有此函数:

public virtual bool Exists<ENTITY>(Expression<Func<ENTITY, bool>> expr)
{
    return this._dbSet.Count(expr) > 0;
}
存在公共虚拟bool(表达式expr)
{
返回此值。_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;
}
存在公共虚拟bool(表达式expr)
{
var tmp=expr.Compile();
返回此值。_dbSet.Count(tmp)>0;
}
我得到另一个错误:

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


我做错了什么,还是编译器疯了?我使用的是VS2017 C#7.1

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

您的类已经是泛型的,带有一个参数
实体
。因此,请删除
Exists
,因为这意味着您的方法是泛型的,并且与您的类不同。但是它必须是与类和您的
DbSet
相同的泛型参数,所以只需使用类的泛型参数即可

class Repository<ENTITY>
{
    public virtual bool Exists(Expression<Func<ENTITY, bool>> expr)
    {
        return this._dbSet.Count(expr) > 0;
    }
}
类存储库
{
存在公共虚拟bool(表达式expr)
{
返回此值。_dbSet.Count(expr)>0;
}
}


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

,假设您要在
\u dbSet
中计算满足谓词-的实体,以便在编译表达式树后检查是否存在任何元素

var tmp = expr.Compile();
您应该添加以下内容:
返回此内容。_dbSet.Where(entity=>tmp(entity.Count()>0;

更新

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

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

您提到的两个错误完全相同expression is method definition(类似于类),func is method reference(类似于实例),它们不相同。您可以调用
expression.compile()
从表达式中获取实例func。您不应该使用
x.Count()>0
因为这可能需要您的数据源获取并清点您的所有项目,只是为了检查是否存在任何项目,这是非常低效的。请使用
x.any()
因为这里只需要提取一个项目就可以知道是否有任何项目。修复了错误消息。不,它们不一样。这是复制粘贴@nvoigt的结果,你是100%正确的。从中删除已存在的项目修复了所有问题。我将其更改为any()。谢谢你的建议:)