首页 > 解决方案 > Xrm.Sdk Linq 与 Joins 和动态 where

问题描述

经过一段时间让我的查询在语法上正确后,看起来 sdk 有一些限制。我还尝试了一个带有设施的子查询,但它返回了一个 IQuery(i 或其他东西)。有没有办法在 Linq Xrm 查询中实现动态 where 子句

抛出的异常

System.NotSupportedException:方法“Where”不能跟随方法“Select”或不受支持。尝试根据支持的方法编写查询,或者在调用不受支持的方法之前调用“AsEnumerable”或“ToList”方法。

var predicate = PredicateBuilder.New<GetAllResult>(false);

if (query?.ObservationOnStart != null && query?.ObservationOnEnd != null)
{
    predicate.And(result =>
        result.ObservationEntity.esor_ObservationOn >= query.ObservationOnStart &&
        result.ObservationEntity.esor_ObservationOn <= query.ObservationOnEnd);
}


var queryable = from observationEntity in _ctx.esor_ObservationSet
        join facilityEntity in _ctx.core_FacilitySet
            on observationEntity.esor_Facility.Id equals facilityEntity.Id
        orderby observationEntity.esor_ObservationOn
        select new GetAllResult {ObservationEntity = observationEntity, FacilityEntity = facilityEntity}
    ;


// THIS throws exception
 queryable.Where(predicate).ToList(); 

我也尝试过检查变量和使用的和 OR 但它也会引发异常

where completedById.Equals(null) || observationEntity.esor_CompletedBy.Id.Equals(completedById)

System.NotSupportedException:“where”条件无效。实体成员正在调用无效的属性或方法

标签: c#linqdynamics-crmxrm

解决方案


在您的第一个代码段中,您首先调用:

select new GetAllResult 

接着

queryable.Where(predicate) 

这是行不通的。因为 - 正如你所发现的 - 你不能在打电话where后打电话select

然后,在您的第二个代码片段中,您调用:

where completedById.Equals(null)

这不起作用,因为 where 子句的左侧必须是实体属性名称,而completedById显然是您在某处定义的变量。

CRM Dynamics 的 Linq 查询必须保持非常简单,如果您坚持使用 Linq(而不是说,QueryExpression),请执行以下操作:

// ... build you queryable, and then:

// 1. first, call ToList()
var records = queryable.ToList();

// 2. then, filter it with Where()
if (query?.ObservationOnStart != null && query?.ObservationOnEnd != null)
{
    records = records.Where(r =>
        r.ObservationEntity.esor_ObservationOn >= query.ObservationOnStart &&
        r.ObservationEntity.esor_ObservationOn <= query.ObservationOnEnd
    ).ToList();
}

推荐阅读