CRM 2011:查询表达式的限制?

时间:2012-03-07 17:29:47

标签: c# linq-to-sql dynamics-crm dynamics-crm-2011

我相信这个问题的答案可能是使用Linq to Sql,但想知道这是否可以使用QueryExpressions: -

我创建了一个查询表达式,它针对实体A进行查询,它还链接到实体B(通过LinkEntity)并强制执行其他条件。可以通过添加适当的属性名称从实体B中检索列。但是,它只会检索链接的实体(内部联接)。

是否可以使用QueryExpression从实体B检索与实体A相关的所有相关记录(和所需列)(例如,与联系人通过指定标准的联系人相关的所有案例)。通常我会考虑反转查询并使用适当的LinkEntity条件搜索实体B与实体A的关系,但是我想为同一个联系人查询检索许多链接的实体。

所以我留下了一些选择: -

(1)执行第二次查询(在迭代初始查询的大量结果时不理想), (2)在过滤后的视图上使用Linq to CRM执行查询, (3)完全不同的方法?

任何想法都会受到赞赏。

修改

我最终使用Linq-to-Sql来完成此任务,所使用的代码与下面的代码类似(尽管实际查询还有一些连接!): -

var dataCollection = (from eA in xrmServiceContext.EntityASet

join eB in xrmServiceContext.EntityBSet on new  EntityReference(EntityA.EntityLogicalName, eA.Id) equals (EntityReference)eB.EntityBLookupToEntityA
select new
{
    Id = eA.Id,
    EntityBInterestingAttribute = eB.InterestingAttributeName 
}

所以这将为每个实体A返回一行,每个实体B.为了使事情变得更容易,我然后定义了一个自定义类“MyEntityAClass”,它具有Lists属性,所以我可以返回一个对象来填充GridView等。更多的是处理这些结果,所以我没有在这里发布代码。

我希望这是有道理的。从本质上讲,每个记录的多行是一个SQL,这使得这个方法起作用。

1 个答案:

答案 0 :(得分:-3)

QueryExpression只能从一种类型的实体返回字段,即QueryExpression.EntityName中指定的实体。

您可以使用FetchXML,它允许您获取任何链接实体的字段,这对您来说是一个选项3,不幸的是它将数据作为XML返回,然后您必须自己解析。

运行FetchXML可能会更快,但是需要longet来编写和测试,而且它也不是最简单的维护。

示例代码,这将获得所有活动帐户中活动的所有案例中的前101个

string fetch = "<fetch count='101' mapping='logical'><entity name='account'><filter type='and'><condition attribute='statecode' operator='eq' value='1'/></filter><link-entity name='incident' from='customerid' to='accountid'><all-attributes/><filter type='and'><condition attribute='statecode' operator='eq' value='1'/></filter></link-entity></entity></fetch>";

string data = yourCrmServiceObject.Fetch(fetch);