c# – 如何动态地构造/更改LINQ语句的一部分
发布时间:2020-12-15 23:44:34 所属栏目:百科 来源:网络整理
导读:我的应用程序中有一个方法,需要根据一组标准读取,过滤和提供数据. 我正在尝试使用LINQ来完成此任务: var pipelineData = from data in new XPQueryAccountView3.PipelineData(uow) where data.Stage.ToLower().Contains("won") data.RevenueStartDate.Value
我的应用程序中有一个方法,需要根据一组标准读取,过滤和提供数据.
我正在尝试使用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等… 我的问题是:有没有办法以这种方式构造LINQ语句,语句的一部分是有条件地执行的.因此,如果用户传递“Platform”作为搜索条件,则LINQ语句将读取… string.IsNullOrEmpty(data.PlatformTcv),但如果条件为“Cyber??”,则此LINQ语句应读取… string. IsNullOrEmpty(data.Cyber??Tcv) 解决方法
当然.利用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(); (这假设查询元素类型是DataObject.当然,您可以将其替换为您正在使用的任何类型的实际名称). 请记住,这将使LINQ更难理解,并始终牢记查询的延迟执行性质.即如果它们没有像其他集合那样“物化”(例如调用ToArray()),那么下次执行时将会显示对基础查询的更改. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |