无法将Expression< Func< Entity, bool> >转换为Func< Entity, bool>

3

我在我的代码中有这个函数:

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

我遇到了以下错误:

无法将 System.Linq.Expressions.Expression< System.Func< ENTITY, bool>> 转换为 System.Func< ENTITY, bool>

如果我将函数更改为以下内容:

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

我遇到了另一个错误:

无法将 System.Func< ENTITY, bool> 转换为 System.Linq.Expressions.Expression< System.Func< ENTITY, bool> >

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


2
你提到的这两个错误完全相同。 - undefined
表达式是方法定义(类似于类),func是方法引用(类似于实例),它们并不相同。你可以调用expression.compile()来从表达式中获取一个实例的func。 - undefined
不应该使用x.Count() > 0,因为这可能需要数据源抓取和计算所有项目才能检查是否有任何项目,这样非常低效。应该使用x.Any(),因为只需要获取一个项目就可以知道是否有任何项目。 - undefined
修复了错误信息。不,它们不一样。这是复制粘贴的结果。 - undefined
2个回答

4
假设您想计算满足谓词的_entity在_dbSet中的实体数量-为了检查是否有任何元素存在,在编译表达式树后,
var tmp = expr.Compile();

你需要添加这个: return this._dbSet.Where(entity => tmp(entity).Count() > 0;

更新

正如已经由nvoigt在他的答案中指出的那样,更合理的做法是使用Any方法:

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

我把它改成了Any()。谢谢你的好建议 :) - undefined

2
您没有发布完整的代码,因此我在这里猜测:
您的类已经具有参数为ENTITY的泛型。因此,请删除<ENTITY>,因为这意味着您的方法是泛型的,而且与您的类不同。但它必须是与类和DbSet相同的泛型参数,因此只需使用类的泛型参数即可。
class Repository<ENTITY>
{
    public virtual bool Exists(Expression<Func<ENTITY, bool>> expr)
    {
        return this._dbSet.Count(expr) > 0;
    }
}

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

@nvoigt 你是100%正确的。从exists中移除<ENTITY>解决了所有问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接