gpt4 book ai didi

c# - 如何动态构造/更改 LINQ 语句的一部分

转载 作者:行者123 更新时间:2023-11-30 13:30:52 25 4
gpt4 key购买 nike

我的应用程序中有一个方法,需要根据一组条件读取、过滤和提供数据。我正在尝试使用 LINQ 来完成此任务:

var pipelineData = from data in new XPQuery<AccountView3.PipelineData>(uow)
where data.Stage.ToLower().Contains("won")
&& data.RevenueStartDate.Value.Year == DateTime.Today.Year
&& data.WeekOfTheYear >= priorWeekCutoff
&& (!string.IsNullOrEmpty(data.PlatformTcv) && data.PlatformTcv != "#N/A")
select data;

就其本身而言,它工作得很好。问题是 - 根据正在传递的搜索条件,而不是 data.PlatformTvc,它可能是 data.WorkspaceTvc 或 data.Cyber​​Tvc 等...我没有办法提前知道需要评估 5 个可能的选择中的哪一个。

我的问题是:有没有一种方法可以构造 LINQ 语句,使语句的一部分有条件地执行。因此,如果用户通过“平台”作为搜索条件,LINQ 语句将读取 ... string.IsNullOrEmpty(data.PlatformTcv),但如果条件是“Cyber​​”,则此 LINQ 语句应该阅读 ... string.IsNullOrEmpty(data.Cyber​​Tcv)有办法实现吗?

最佳答案

当然。利用 LINQ 的延迟执行模型并将可更改的谓词嵌入到查询中。例如:

Func<DataObject, string> accessor = data => data.PlatformTcv;

var pipelineData = from data in new XPQuery<AccountView3.PipelineData>(uow)
where data.Stage.ToLower().Contains("won")
&& data.RevenueStartDate.Value.Year == DateTime.Today.Year
&& data.WeekOfTheYear >= priorWeekCutoff
&& (!string.IsNullOrEmpty(accessor(data))
&& accessor(data) != "#N/A")
select data;

var basedOnPlatform = pipelineData.ToArray();

accessor = data => data.CyberTV;

var basedOnCyber = pipelineData.ToArray();

(假设查询元素类型为 DataObject。当然,您可以将其替换为您正在使用的任何类型的实际名称)。

请记住,这会使 LINQ 更难理解,并始终牢记查询的延迟执行性质。 IE。如果它们没有像其他集合那样“物化”(例如调用 ToArray()),那么在您下次执行它时,底层查询的更改将显示出来。

关于c# - 如何动态构造/更改 LINQ 语句的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26768401/

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