我尝试重构这个查询有一段时间了,但没有成功:
db.Kiosks.Where(kiosk => db.KioskDesignations.Where(
q =>
q.Kiosk.KioskId == kiosk.KioskId &&
(!q.RedesignedAt.HasValue||q.RedesignedAt.Value<= DateTime.Now))
.OrderByDescending(q => q.RedesignedAt)
.Take(1).Select(q => q.Type.DefinitionId).Contains(id)
);
问题在于。每个信息亭都有一个历史名称集合,在应用程序的某些部分,我们希望根据其最新状态执行某些操作(通过检查其类型或事件或其他一些数据),因此这部分查询将重复:
db.KioskDesignations.Where(q =>
q.Kiosk.KioskId == kiosk.KioskId &&
(!q.RedesignedAt.HasValue || q.RedesignedAt.Value <= DateTime.Now))
.OrderByDescending(q => q.RedesignedAt).Take(1)
到目前为止,我已经尝试将这部分编写为函数、Func 和表达式,但它们都不起作用。您能告诉我应该如何重构这个查询,以便我可以重用重复部分吗? 非常感谢。
最佳答案
例如,您可以链接Wheres:
private void Something()
{
var query = GetStandardWhere(db.Kiosks);
query = query.Where( //some new criteria);
return query
.OrderByDescending(q => q.RedesignedAt)
.Take(1).Select(q => q.Type.DefinitionId).Contains(id)
);
}
private IQueryable<KioskDesignation> GetStandardWhere(IQueryable<KioskDesignation> query)
{
return
query.Where(
kiosk =>
db.KioskDesignations.Where(
q =>
q.Kiosk.KioskId == kiosk.KioskId &&
(!q.RedesignedAt.HasValue || q.RedesignedAt.Value <= DateTime.Now));
}
关于c# - 如何重构 linq 查询以重用其部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16945187/