守则:
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天内已关闭(已解决)或< / em>用户希望查看完整的历史记录(在这种情况下,检索所有案例,无论是打开还是关闭)。
ShowFullCaseHistoryBox
是一个Winforms复选框;选中后,应检索帐户的完整案例历史记录。
CrmCaseListItem
是一个DTO,用作DataGridView的支持;它在其构造函数中使用Incident,并公开Grid上显示的属性。
错误:
'where'条件无效。实体成员正在调用无效的属性或方法。
问题:
我想做的是什么,这是无效的?第一个条款,匹配帐户ID(因此需要一个投影),自己工作得很好,所以我必须假设它是其中一个,但我无法确定哪个。正在检查的事件的属性不会被预测或操纵,这是Queryables通常的禁忌,所以我真的不知所措。
编辑(已经再次编辑):
在运行一些测试以评估每个单独的子句之后,使用目前为止的一些建议并将该子句的所有已知良好元素重新插入到一起,这是最接近的工作:
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();
唯一仍未运行的是检查CheckBox以显示完整的案例历史记录(基本上覆盖前两个关于状态或解决方案日期的子句)。它不能正常工作(取消注释内联表达式)或者它被提取到变量中。其他一切似乎都按预期工作。这个功能是可选的,所以如果它根本不起作用,没有办法,没有办法,那么我会轻轻地将它分解给客户端,但我真的很喜欢这个,因为我只是如此接近。有什么想法吗?
答案 0 :(得分:0)
必须将LINQ to CRM转换为查询表达式。处理查询表达式时,必须使用选项集值的int值。尝试在您的选项集属性上调用.Value,然后将枚举转换为预期值,看看是否能解决您的问题。
您还可以使用Early Bound Generator,它会在您的实体上创建早期绑定枚举属性。那么你就不必将枚举强制转换为整数,也不必将.value
放在那里。