c# - 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”条件无效。实体成员正在调用无效的属性或方法
解决方案
在您的第一个代码段中,您首先调用:
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();
}
推荐阅读
- java - Spring Channel Interceptor - 如何在不引发错误的情况下返回空消息
- c# - 我想将光线投射到由 x 轴和 z 轴产生的假想平面
- import - 导入的 protobuf 是否应该在 gRPC 中有选项?
- python - PySimpleGUI 输出元素换行符
- javascript - 自定义 Javascript 在 Wordpress 中不起作用
- c# - 如何在 Xamarin 的同一 API 中传递表单数据和 json?
- flutter - 使用ffmpeg向视频添加音频不起作用
- javascript - 使用递归函数时如何避免模块之间的循环依赖?
- flutter - 在颤振/飞镖中与图像下的小部件交互
- javascript - 傀儡师的麻烦。或者,至少,javascript 的麻烦;你决定,请