Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XRM where子句中的可空筛选器_C#_Linq_Dynamics Crm 2011_Dynamics Crm_Xrm - Fatal编程技术网

C# XRM where子句中的可空筛选器

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时,应返回所有实体,否则将按参数过滤。但是我想不出一种方法来做到这一点,而不打破上述要求,或者编写多

我在WCF项目中使用XRM(早期绑定)类型,因此我可以访问CRM模型并使用LINQ查询。但是我遇到了,这是针对XRM LINQ的
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次多一点,因为我认为您需要每个组合,我不认为您需要返回语句中的括号。