gpt4 book ai didi

c# - Linq where 子句 "if item is not null, evaluate, otherwise, get all data"

转载 作者:行者123 更新时间:2023-12-02 08:34:43 24 4
gpt4 key购买 nike

我正在尝试在 Web 客户端上实现一个过滤器表单,该表单可以填写任意数量的项目或为空。我的 WebAPI 方法将采用包含表单所有属性的模型,如下所示:

RequisitionType (enum: RequisitionType.RequisitionedBy, RequisitionType.CreatedBy)
Vendor (string or null)
Plant (string or null)
CompanyCode (string or null)
CreatedFrom (datetime)
CreatedTo (datetime)

如何在没有很多疯狂的 if (condition) { filter } 的情况下实现 linq 查询?

我试过类似的方法,首先检查过滤器是否有值,如果有,我会将字段与该值进行比较,否则我会将字段与自身进行比较,但编译器不会允许。

在下面的示例中,model 是从客户端传递给 Controller ​​的内容。

var data =  logic.GetPurchaseReqs()
.Where(pr => {
model.RequisitionType == RequisitionType.RequisitionedBy ? pr.PrReqId.ToUpper() == model.Username.ToUpper() : pr.PrReqId.ToUpper() == pr.PrReqId.ToUpper()
&& model.RequisitionType == RequisitionType.CreatedBy ? pr.PrCreId.ToUpper() == model.Username.ToUpper() : pr.PrCreId.ToUpper() == pr.PrCreId.ToUpper()
&& model.Vendor != null ? pr.Vendor == model.Vendor : pr.Vendor == pr.Vendor
[etc...]
})
.ToList();

最佳答案

我相信最简单的简化方法是:

logic.GetPurchaseReqs()
.Where(pr => model.RequisitionType != RequisitionType.RequisitionedBy || pr.PrReqId.ToUpper() == model.Username.ToUpper())
.Where(pr => model.RequisitionType != RequisitionType.CreatedBy || pr.PrCreId.ToUpper() == model.Username.ToUpper())
.Where(pr => model.Vendor == null || pr.Vendor == model.Vendor)
//[...]
.ToList();

请注意,添加几个 Where 子句会带来极小的开销(只是 JIT 调用函数所需的处理能力),但恕我直言会提高可读性。

关于c# - Linq where 子句 "if item is not null, evaluate, otherwise, get all data",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23015125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com