针对事件的 CRM Linq 查询 - 在条件无效的情况下

本文关键字:条件 无效 情况下 Linq 事件 CRM 查询 | 更新日期: 2023-09-27 17:57:00

代码:

var site = CrmRepository.QueryFor<Account>()
                .Where(a => a.iss_OperatorSiteId == OperatorSiteId.ToString())
                .FirstOrDefault();
SiteCases = CrmRepository.QueryFor<Incident>()
                    .Where(i => i.AccountId.Id == site.Id
                                && (i.iss_Status != new OptionSetValue(
                                      (int)StatusOptionSet.Closed) 
                                   && i.iss_Status != new OptionSetValue(
                                      (int)StatusOptionSet.PendingFinalization))
                                || (i.iss_ResolutionDate == null 
                                    || i.iss_ResolutionDate > 
                                          DateTime.Today.AddDays(-30))
                                || (ShowFullCaseHistoryBox.Checked))
                    .AsEnumerable()
                    .Select(i => new CrmCaseListItem(i))
                    .ToList();

详情:

  • CrmRepository是由 CrmSvcUtil 生成的 CRM Linq 上下文的包装器,使其适应用于其他数据存储的通用IRepository接口。QueryFor<Incident>()调用等效于对上下文本身的CreateQuery<Incident>()调用。

  • iss_Status是"选项集"类型的属性。 StatusOptionSet 是一个枚举,旨在简化代码中选项值的使用。

  • iss_ResolutionDate是不言自明的,并且为简单起见,包含而不是引用案例解决记录,并且因为在我们的工作流中,案例实际上不会"解决",直到问题不仅得到解决,而且案例记录和相关记录已经过处理和审核,因此对于 SLA 义务,我们需要知道问题何时解决,而不是何时应用解决方案以完全关闭案例。

  • 基本思想是显示与特定帐户关联的事件(我们称之为案例),这些事件要么处于打开状态,要么在过去 30 天内已关闭(已解决),或者用户希望查看完整历史记录(在这种情况下,将检索所有案例,无论是打开的还是已关闭的)。

  • ShowFullCaseHistoryBox是 WinForms 复选框;选中后,应检索帐户的完整案例历史记录。

  • CrmCaseListItem 是用作 DataGridView 支持的 DTO;它在其构造函数中获取事件并公开网格上显示的属性。

错误:

无效的"位置"条件。实体成员正在调用无效的属性或方法。

问题:

我试图做什么是无效的?第一个子句与帐户 ID 匹配(因此需要投影),本身工作正常,所以我必须假设它是其他子句之一,但我无法确定是哪个。正在检查的事件的属性不会被投影或操纵,这是可查询对象通常的禁忌,所以我在这里真的很茫然。

编辑(已再次编辑):

在运行它通过一些测试来评估每个单独的子句之后,使用到目前为止的一些建议并将子句的所有已知良好元素重新插入在一起,这是最接近的方法:

var site = CrmRepository.QueryFor<Account>()
                .Where(a => a.iss_OperatorSiteId == OperatorSiteId.ToString())
                .FirstOrDefault();
SiteCases = CrmRepository.QueryFor<Incident>()
                .Where(i => (i.AccountId.Id == site.Id) &&
                       (
                           (i.iss_Status.Value != (int) StatusOptionSet.Closed
                            && i.iss_Status.Value != (int) StatusOptionSet.PendingFinalization)
                           || (i.iss_ResolutionDate != null
                               && i.iss_ResolutionDate.Value > DateTime.Today.AddDays(-30))
                       //|| ShowFullCaseHistoryBox.Checked
                       )
                )
                .AsEnumerable()
                .Select(i => new CrmCaseListItem(i))
                .ToList();

唯一仍然不起作用的是选中复选框以显示完整的案例历史记录(基本上覆盖了关于状态或解决日期的前两个子句中的任何一个)。它不会按原样工作(取消注释内联表达式)或将其提取到变量中。其他一切似乎都按预期工作。此功能是可选的,所以如果它根本不起作用,没办法,没有办法,那么我会轻轻地把它打破给客户,但我真的很想让它工作,因为我太接近了。有什么想法吗?

针对事件的 CRM Linq 查询 - 在条件无效的情况下

LINQ to CRM 必须转换为查询表达式。处理查询表达式时,必须使用选项集值的 int 值。 尝试调用 。选项集属性的值,只需将枚举转换为预期值即可查看是否可以解决问题。

还可以使用早期绑定生成器,它会在实体上创建早期绑定枚举属性。 这样你就不必将枚举转换为整数,也不必.value放在那里。