加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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等…
我没有办法提前知道哪些可能的5个选择需要评估.

我的问题是:有没有办法以这种方式构造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()),那么下次执行时将会显示对基础查询的更改.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读