c# – Modularize(重构)Linq查询
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Modularize(重构)Linq查询,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1913字,纯文字阅读大概需要3分钟。
内容图文
![c# – Modularize(重构)Linq查询](/upload/InfoBanner/zyjiaocheng/791/7fee76bec4af4f68b3a39e463b07f1d0.jpg)
我有几个Linq查询.在语义上,他们是
> a join b join c join d where filter1(a)&& filter2(c)&&过滤器3(d)
> a join b join c where filter1(a)&&过滤器2(c)中
> a join b join c join e where filter1(a)&& filter2(c)&&过滤器4(e)中
…
我希望能够分解共享部分:
a join b join c where filter1(a) && filter2(c)
并动态追加连接d和filter3(d)
有没有办法做到这一点?我已经在使用Predicate Builder来动态构建条件(过滤器).
编辑:我正在使用Linq-to-SQL.
编辑:基本查询如下所示:
from a in As.AsExpandable()
join b in Bs on a.Id equals b.PId
join c in Cs on b.Id equals c.PId
where filter1(a) && filter2(b) && filter3(c)
select new A { ... }
过滤器是Predicate Builder中的谓词.查询的类型是IQueryable< A>.
接下来,我想和d一起加入
from a in BaseQuery()
join d in D on a.Id equals d.PId
目前加入d ..导致编译错误:
The type of one of the expressions in the join clause is incorrect. Type inference failed in the call to Join
解决方法:
您的示例有点模糊,但很容易创建一个返回IQueryable< T>的方法.并重用该方法,如果这是你的意思.这是一个例子:
// Reusable method
public IQueryable<SomeObject> GetSomeObjectsByFilter(Context c)
{
return
from someObject in context.SomeObjects
where c.B.A.Amount < 1000
where c.Roles.Contains(r => r.Name == "Admin")
select someObject;
}
您可以在其他地方重用此方法,如下所示:
var q =
from c in GetSomeObjectsByFilter(context)
where !c.D.Contains(d => d.Items.Any(i => i.Value > 100))
select c;
因为IQueryable的工作方式,只有最终查询(你开始迭代的集合)才会触发对数据库的调用,这允许你通过重用在数据库中有效执行的业务逻辑来构建一个高度可维护的系统,从而减少损失任何表现.
我一直这样做,它提高了代码的可维护性.无论您运行哪种O / RM工具,它都可以工作,因为Queryable< T>中没有任何区别.组合,在一个和平中写入查询,或者将其分解为不同的方法.
请注意,有时您需要进行一些智能转换才能在单个方法中获取重复的部分.可能有帮助的事情是返回分组集,并返回一组不同于您认为需要的类型.这听起来有点不透明,但是当你在分割方法时遇到问题时,只需在这里发布一个问题.这里有足够的人可以帮助你.
内容总结
以上是互联网集市为您收集整理的c# – Modularize(重构)Linq查询全部内容,希望文章能够帮你解决c# – Modularize(重构)Linq查询所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。