我正在尝试执行此查询以检索特定实体类型的审核项目
public List<Audit> GetAuditChangesSince(DateTime since, string entityType)
{
return (from a in OrgContext.CreateQuery<Audit>()
where
a.ObjectId != null && a.ObjectId.LogicalName == entityType &&
a.CreatedOn > since
select a).ToList();
}
a.ObjectId!= null&amp;&amp; a.ObjectId.LogicalName == entityType&amp;&amp; 子句导致问题。我知道.Equals()可能会导致问题(因此==)并且LINQ提供程序存在这些限制:
子句的左侧必须是属性名称,子句的右侧必须是值
左侧是属性,右侧是常量。是.ObjectId.LogicalName导致问题吗?
答案 0 :(得分:6)
由于审计实体没有为特定记录所涉及的实体的逻辑名称/类型代码提供地面级属性,因此您在此处可以做的最好的事情是链接到您实体(或多个实体)希望找到审计记录 - 即不检索所有记录。
这种情况的一般技术是,您可以链接到具有半无意义条件的相关实体,例如检查主键不为空。对于您的情况,只需链接即可。
拉动与联系人关联的审核记录的示例:
from a in OrgContext.CreateQuery<Audit>()
join c in ContactSet on a.ObjectId.Id equals c.ContactId
where a.ObjectId != null && a.CreatedOn > since
select a
答案 1 :(得分:1)
在ToList()
方法之后添加CreateQuery
,这样您的条件将适用于LINQ to Objects
提供商,而不适用于CRM LINQ提供商(及其限制)
public List<Audit> GetAuditChangesSince(DateTime since, string entityType)
{
return (from a in OrgContext.CreateQuery<Audit>().ToList()
where
a.ObjectId != null && a.ObjectId.LogicalName == entityType &&
a.CreatedOn > since
select a).ToList();
}