如何制作可用于可查询的可重用条件? [复制]
Posted
技术标签:
【中文标题】如何制作可用于可查询的可重用条件? [复制]【英文标题】:How to make reusable conditions that can be used in queryables? [duplicate] 【发布时间】:2021-11-17 14:32:51 【问题描述】:所以在一个函数中,我有一个大的可查询对象,我根据其他条件应用了一堆 where 原因。
就像这个例子:
query.Where(i =>
_context.FicDernierEvt
.Where(y => y.VteAffaire == null && y.ApvAffaire == null)
.Select(y => y.IdFicheCrm)
.Contains(i.Id)
);
我有这个条件_context.FicDernierEvt.Where(y => y.VteAffaire == null && y.ApvAffaire == null).Select(y => y.IdFicheCrm).Contains(i.Id)
,在我的代码中经常使用。
我想避免在我的代码中出现这一切,所以我尝试制作一个函数:
private bool isProspect(FicFicheCrm ficheCrm)
return _context.FicDernierEvt
.Where(y => y.VteAffaire == null && y.ApvAffaire == null)
.Select(y => y.IdFicheCrm)
.Contains(ficheCrm.Id);
所以我可以这样使用它:
query.Where(i => isProspect(i));
但它没有用,因为它不应该这样做。
有人知道如何将这样的可重用条件用于可查询对象吗?
【问题讨论】:
【参考方案1】:我的建议是使用包含谓词的 Where 方法来扩展 LINQ。
如果您不熟悉扩展方法,请考虑阅读Extension Methods Demystified
您懒得告诉我们您在_context.FicDernierEvt
中存储的IQueryable<...>
的类型,但我们假设它是IQueryable<FicDernierEvt>
。换句话说,假设 _context.FicDernierEvt 是 FicDernierEvts 的表。
要求过程
GetIdFics
(TODO:发明专有名称)将IQueryable<FicDernierEvt>
作为输入,只保留那些两者都具有空值的ficDernierEvts
属性VteAffaire
和ApvAffaire
,并从每个剩余的ficDernierEvt 中返回属性ficDernierEvt.IdFic
的值
我不知道IdFic
的类型,但我们假设它是一个int
public static IQueryable<int> GetIdFics( // TODO: invent proper name
this IQueryable<FicDernierEvt> source)
return source.Where(ficDernierEvt => ficDernierEvt.VteAffaire == null
&& ficDernierEvt.ApvAffaire == null)
.Select(ficDernierEvt => ficDernierEvt.IdFic);
就是这样!
用法:
IQueryable<int> myIdFics = _context.FicDernierEvt.GetIdFics();
你说你在很多地方都有这个 Where/Select:
var oldIdFics = _context.FicDernierEvt
.Where(ficDernierEvt.Date.Year < 2010)
.GetIdfics();
var invalidIdFics = _context.FicDernierEvt.GetIdFics()
.Where(idFic => idFic <= 0);
您甚至可以在更复杂的 LINQ 语句中使用它:
IQueryable<FicDernierEvt> unpaidFicDernierEvts = this.GetUnpaidFicDernierEvts();
int customerId = this.GetCustomerId(customerName);
var largestUnpaidCustomerIdFic = unpaidFicDernierEvts
.Where(unpaidEvt => unpaidEvt.CustomerId == customerId)
.GetIdFics()
.Max();
【讨论】:
以上是关于如何制作可用于可查询的可重用条件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章