【问题标题】:Xrm.Sdk Linq with Joins and dynamic whereXrm.Sdk Linq 与 Joins 和动态 where
【发布时间】:2020-04-21 07:11:44
【问题描述】:

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

抛出的异常

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

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# linq dynamics-crm xrm


    【解决方案1】:

    在你的第一个代码 sn-p 中,你首先调用:

    select new GetAllResult 
    

    然后

    queryable.Where(predicate) 
    

    这是行不通的。因为 - 正如你所发现的 - 在调用 select 之后,你不能再调用 where

    然后,在您的第二个代码 sn-p 中,您调用:

    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();
    }
    

    【讨论】:

    • 我现在意识到我必须使用查询表达式.. 我不能用 linq 做很多事情
    • 记住你也可以使用FetchExpression。另外,如果您认为此问题已回答,请将其标记为已接受。
    猜你喜欢
    • 2019-03-28
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 2014-12-05
    • 1970-01-01
    • 2011-03-26
    • 2023-03-29
    相关资源
    最近更新 更多