Csharp/C#教程:智能表达翻译分享


智能表达翻译

我正在创建一个IQueryable,我想用它来传递给entity framework的查询。 我的存储库不公开可查询。

var query = new List().AsQueryable().Where(x => x.Property == "argument"); 

我的存储库中有一个方法可以接收IQueryable。

如何使用相同的可查询来查询我的DbSet? 我试图从可查询中提取表达式为dbset构建一个新的表达式。 这是我到目前为止,但它不起作用:

 public IDbSet DbSet { get; set; } public IEnumerable Find(IQueryable queryable) { var parameter = Expression.Parameter(typeof (TEntity)); var body = queryable.Expression; var lambda = Expression.Lambda<Func>(body, parameter); var result = DbSet.Where(lambda); return null; } 

当我尝试使用以下错误创建lambda时代码失败:类型’System.Linq.IQueryable`1 [MyTEntity]’的表达式不能用于返回类型’System.Boolean’

我显然没有正确构建表达式,我缺少什么? 有没有更简单的方法来做我想要完成的事情?

我还看到一些示例表明Expression应该有一个参数属性。 但无论我转换为什么类型的表达式类型,并且这个是ConstantExpression,我都没有看到IQueryable.Expression中的参数属性。

在您的情况下, queryable.Expression表示整个表达式Queryable.Where(constantList, x => x.Property == "argument") 。 如果你只想要Where() lambda,你需要提取它。 为此,您可以使用以下代码:

上述就是C#学习教程:智能表达翻译分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 public IEnumerable Find(IQueryable queryable) { var methodCall = queryable.Expression as MethodCallExpression; Func, Expression>, IQueryable> whereDelegate = Queryable.Where; if (methodCall.Method == whereDelegate.Method && methodCall.Arguments[0] is ConstantExpression) { var whereLambdaQuote = (UnaryExpression)methodCall.Arguments[1]; var whereLambda = (Expression>)whereLambdaQuote.Operand; var result = DbSet.Where(whereLambda); } return null; } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1011441.html

(0)
上一篇 2021年12月30日
下一篇 2021年12月30日

精彩推荐