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.Expressionpublic 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我做错了什么,还是编译器疯了?我使用的是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()。谢谢你的建议:)