8

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

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 && a.ObjectId.LogicalName == entityType &&子句导致问题。我知道 .Equals() 可能会导致问题(因此 ==),并且 LINQ 提供程序有以下限制:

子句的左侧必须是属性名,子句的右侧必须是值

左边是属性,右边是常数。.ObjectId.LogicalName 是否导致问题?

4

2 回答 2

8

因为审计实体没有为与特定记录相关的实体的逻辑名称/类型代码提供基本属性,所以您可以在这里做的最好的事情是链接到您希望定位的实体(或多个实体)审计记录——即不检索所有记录。

此类场景的一般技术是,您可以使用半废话条件链接到相关实体,例如检查主键是否不为空。对于您的情况,仅链接就足够了。

提取与联系人关联的审计记录的示例:

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
于 2013-05-27T04:33:41.690 回答
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();
}
于 2013-05-23T09:43:56.793 回答