C# XRM where子句中的可空筛选器
我在WCF项目中使用XRM(早期绑定)类型,因此我可以访问CRM模型并使用LINQ查询。但是我遇到了,这是针对XRM LINQ的C# XRM where子句中的可空筛选器,c#,linq,dynamics-crm-2011,dynamics-crm,xrm,C#,Linq,Dynamics Crm 2011,Dynamics Crm,Xrm,我在WCF项目中使用XRM(早期绑定)类型,因此我可以访问CRM模型并使用LINQ查询。但是我遇到了,这是针对XRM LINQ的where子句的限制: 其中[条款限制] 子句的左侧必须是属性名,右侧必须是 该子句必须是一个值。不能将左侧设置为常量。二者都 子句的边不能是常量 支持字符串函数Contains、StartsWith、EndsWith和Equals 不断出现的一个要求是,当参数为null时,应返回所有实体,否则将按参数过滤。但是我想不出一种方法来做到这一点,而不打破上述要求,或者编写多
where
子句的限制:
其中[条款限制]
子句的左侧必须是属性名,右侧必须是
该子句必须是一个值。不能将左侧设置为常量。二者都
子句的边不能是常量
支持字符串函数Contains、StartsWith、EndsWith和Equals
不断出现的一个要求是,当参数为null时,应返回所有实体,否则将按参数过滤。但是我想不出一种方法来做到这一点,而不打破上述要求,或者编写多个查询来处理空的场景
这是我的一个查询示例,typeFilter==null
这里的问题是我在LHS上使用了一个常量。在我的实际代码中,有一个guard子句将typeFilter==null
指向另一个查询,但我现在必须添加一个开始/结束日期筛选器(都可以为null),我无法表示我不想为每个null组合编写查询的程度
private IQueryable<EventInfo> getAllEvents( DataContext context, EventType? typeFilter )
{
return (
from evt in context.new_eventSet
where
( evt.statecode == new_eventState.Active ) &&
( typeFilter == null || evt.new_EventType.Value == (int) typeFilter.Value )
select new EventInfo()
{
ID = evt.Id,
EventType = (EventType) evt.new_EventType.Value
...
} );
}
private IQueryable getAllEvents(数据上下文上下文,事件类型?类型筛选器)
{
返回(
来自context.new\u eventSet中的evt
哪里
(evt.statecode==new_eventState.Active)&&
(typeFilter==null | evt.new\u EventType.Value==(int)typeFilter.Value)
选择新事件信息()
{
ID=evt.ID,
EventType=(EventType)evt.new\u EventType.Value
...
} );
}
那么:
if (typeFilter == null)
{
return (
from evt in context.new_eventSet
where
( evt.statecode == new_eventState.Active )
select new EventInfo()
{
ID = evt.Id,
EventType = (EventType) evt.new_EventType.Value
...
} );
}
else
{
return (
from evt in context.new_eventSet
where
( evt.statecode == new_eventState.Active ) &&
evt.new_EventType.Value == (int) typeFilter.Value )
select new EventInfo()
{
ID = evt.Id,
EventType = (EventType) evt.new_EventType.Value
...
} );
}
我已经回答了我自己的问题!有时候,你只是需要一个地方来发泄你的问题,然后才能得到它 诀窍是不要使用LINQ语法:
private IQueryable<EventInfo> getAllEvents( DataContext context, EventType? typeFilter, DateTime? startDateFilter, DateTime? endDateFilter )
{
var result = context.new_eventSet
// active records
.Where( evt => evt.statecode == new_eventState.Active )
// is publish-able
.Where( ..etc.. );
if ( typeFilter != null )
{
// filter by type
result = result.Where( evt => evt.new_EventType.Value == (int) typeFilter.Value );
}
if( startDateFilter != null)
{
// filter by startDate
result = result.Where(evt => evt.new_StartDate > startDateFilter.Value);
}
if( endDateFilter != null)
{
// filter by endDate
result = result.Where(evt => evt.new_StartDate < endDateFilter.Value);
}
return result.Select( evt => new EventInfo()
{
ID = evt.Id,
EventType = (EventType) evt.new_EventType.Value,
...
} );
}
private IQueryable getAllEvents(数据上下文上下文、事件类型?类型筛选器、日期时间?startDateFilter、日期时间?endDateFilter)
{
var result=context.new\u事件集
//活动记录
.Where(evt=>evt.statecode==new\u eventState.Active)
//可以出版吗
.其中(…等);
if(typeFilter!=null)
{
//按类型筛选
result=result.Where(evt=>evt.new\u EventType.Value==(int)typeFilter.Value);
}
if(startDateFilter!=null)
{
//按起始日期过滤
结果=结果。其中(evt=>evt.new\u StartDate>startDateFilter.Value);
}
if(endDateFilter!=null)
{
//按结束日期筛选
结果=结果。其中(evt=>evt.new\u StartDateneweventinfo()
{
ID=evt.ID,
EventType=(EventType)evt.new\u EventType.Value,
...
} );
}
如果要使用Linq语法,可以使用动态构造查询
为此,我在我目前正在进行的Dynamics CRM项目中使用了它,它做得非常好
请参考下面的答案,这就是我的想法:问题是,除了类型过滤器之外,我现在还必须添加开始/结束日期过滤器。用if/else语句将查询写4次来处理额外的过滤器实际上比写3次多一点,因为我认为您需要每个组合,我不认为您需要返回语句中的括号。