无效的CRM 2011 LINQ查询:“无效”,其中'条件。实体成员正在调用无效的属性或方法。“

时间:2013-05-23 07:36:35

标签: linq dynamics-crm-2011 dynamics-crm crm

我正在尝试执行此查询以检索特定实体类型的审核项目

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导致问题吗?

2 个答案:

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