我的应用程序中有一个方法,需要根据一组标准读取,过滤和提供数据.我正在尝试使用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;
Run Code Online (Sandbox Code Playgroud)
就其本身而言,这很好用.问题是 - 取决于正在传递的搜索条件,而不是data.PlatformTvc它可能是data.WorkspaceTvc,或data.CyberTvc等...我没有办法提前知道哪个可能的5选择需要评估.
我的问题是:有没有办法以这种方式构造LINQ语句,语句的一部分是有条件地执行的.因此,如果用户通过"Platform"作为搜索条件,则LINQ语句将读取... string.IsNullOrEmpty(data.PlatformTcv),但如果条件为"Cyber",则应该读取此LINQ语句... string.IsNullOrEmpty(data.CyberTcv)
有没有办法实现此目的?
当然.利用LINQs延迟执行模型并在查询中嵌入可更改的谓词.例如:
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();
Run Code Online (Sandbox Code Playgroud)
(这假设查询元素类型为DataObject.当然,您可以将其替换为您正在使用的任何类型的实际名称).
请记住,这将使LINQ更难理解,并始终牢记查询的延迟执行性质.即如果它们不像其他集合那样"物化"(例如调用ToArray()),那么下次执行时将会显示对基础查询的更改.
| 归档时间: |
|
| 查看次数: |
300 次 |
| 最近记录: |