c# – 使用成员访问lambda表达式来参数化LINQ to SQL谓词
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用成员访问lambda表达式来参数化LINQ to SQL谓词,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1444字,纯文字阅读大概需要3分钟。
内容图文
我有一个需要在整个地方重用的查询,我需要改变哪个属性/列用于连接.
我希望能做的是:
query = RestrictByProp(query, x=>x.ID);
极简化的RestrictByProp()可能是*:
private static IQueryable<Role> RestrictByProp(IQueryable<Role> query,
Func<Role, int> selector)
{
return query.Where(x => selector(x) == 1);
}
问题是即使这个简单的实现也会导致运行时异常:
Method 'System.Object DynamicInvoke(System.Object[])' has no
supported translation to SQL.
**(这里我只是添加一个简单的’where’子句 – 在我的实际代码中,我将使用lambda来选择要用于连接的属性.)*
我发现这很奇怪,因为如果成员访问lambda是内联完成的,那很好:
private static IQueryable<Role> RestrictByID(IQueryable<Role> query)
{
return query.Where(x=> x.ID == 1);
}
如果传入Expression< Func< Role,bool>>,LINQ to SQL也很高兴(即当参数是x => x.ID == 1时)但是因为我需要在查询中确定右手操作数的值而使对象失败.
有没有办法以某种方式在RestrictByProp()中使用lambda表达式,以便LINQ to SQL知道如何生成SQL?
解决方法:
首先,您需要更改方法签名:
private static IQueryable<Role> RestrictByProp(IQueryable<Role> query,
Expression<Func<Role, int>> selector)
这意味着您的lambda表达式将转换为表达式树而不是委托.
然后,您需要构建一个Expression< Func< Role,bool>>从现有的表达式树.
它看起来像这样:
LambdaExpression lambda = (LambdaExpression) selector;
var predicate = Expression.Equal(selector, Expression.Constant(1));
var lambdaPredicate = Expression.Lambda<Func<Role, bool>>(predicate,
lambda.Parameters);
return query.Where(lambdaPredicate);
内容总结
以上是互联网集市为您收集整理的c# – 使用成员访问lambda表达式来参数化LINQ to SQL谓词全部内容,希望文章能够帮你解决c# – 使用成员访问lambda表达式来参数化LINQ to SQL谓词所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。