2012-10-27 19 views
-1

我在here之前问过类似的问题,答案解决了我的问题。但是,现在我得到的问题与之前的相同,但是由于条件的变化,答案不再有效。如何使用QueryExpression对象从CRM中获取所有填充列?

下面是我正在运行的查询。我已经检查过someField被设置为某个东西(这是一个通过guid指向另一个实体的查找字段)。我在result中没有输入(除非我将条件切换为“不等于”)。这可能是由于该字段不带。

当我断点执行和检查Attributes,我看到21个领域共出30的(他们中的一些可能是空的,肯定的,但之一,即someField,是不是),但我感兴趣的人不在那里!

QueryExpression query = new QueryExpression 
{ 
    EntityName = "entity", 
    ColumnSet = new ColumnSet{ AllColumns = true }, 
    // Here I tried the code addition #1 below 
    Criteria = 
    { 
    Filters = 
    { 
     new FilterExpression 
     { 
     Conditions = 
     { 
      new ConditionExpression("someField", ConditionOperator.Equal, guid) 
     } 
     } 
    } 
    } 
}; 
// Here I tried the code addition #2 below 
EntityCollection result = Service.RetrieveMultiple(query); 

我怎么想,我该如何解决它?

我尝试使用LinkEntitiesthis blog讨论,但它并没有真正解决。我甚至不确定这是否是一种有意义的方法。它看起来如下。

LinkEntities = 
    { 
    new LinkEntity 
    { 
     Columns = new ColumnSet { AllColumns = true }, 
     LinkFromEntityName = "entity", 
     LinkFromAttributeName = "otherEntityId", 
     LinkToEntityName = "entity2", 
     LinkToAttributeName = "entity2Id" 
    } 
    }, 

我也尝试雇用solution suggested on MSDN。结果相同。

request.LinkEntities.Add(
    new LinkEntity(
    "entity", "entity2", "otherEntityId", "entity2Id", JoinOperator.Inner)); 
request.LinkEntities[0].Columns.AddColumns("entity2Id"); 
request.LinkEntities[0].EntityAlias = "blobb"; 

再一次 - 由@JamesWood提供的解决方案是不工作了,因为我已经得到了管理员权限的视场不空。

+0

你能不能给我们说,你要执行相当于SQL语句? – Daryl

+0

@Daryl当然!我怀疑它不会有任何用处。看起来有点奇怪(a.k.a.'EntityReference'或我可爱的小名字,在这里没有禁止就不能提到,哈哈)。出于某种原因,查找字段包含在**一些**实体中,而在其他实体中不包含**。在相同的检索! * SELECT * FROM实体WHERE someField =“1234”*,其中“1234”是我的指导。 –

+1

看起来你也有一些问题,一般也是'QueryExpression'。您是否还尝试过使用早期绑定类的CRM linq提供程序? –

回答

1

我相信这里的问题在于FilterExpression和/或实际数据本身。

从你在这里说:

我没有得到任何条目结果(除非我切换的条件“不 等于”)

当您设置过滤器“等“,没有什么等于那个Guid,所以你没有结果。

当您将筛选器设置为“不等于”时,一切都不等于该条件,因此您开始获得一些结果。当你得到结果时,查找不包括在内,因为它是空的记录(因此为什么“相等”过滤器不起作用)。

正如我不能确定我建议采取这些步骤的具体问题:

  1. 对于记录类型,删除所有记录。
  2. 创建一条新记录,填充查找字段。
  3. 编写一个查询,返回该实体的所有字段(例如AllColumns = true而不是指定FilterExpression
  4. 这个查询应该给你一个结果,检查属性集合,以确保查找填充(检查所有的属性,以确保你没有得到错误的名称)。
  5. 然后扩展查询,得到FilterExpression

有一个查找过滤示例here

作为一个侧面说明;您实际上不必在ColumnSet列中指定要用于过滤的列。

E.g.在SQL你可以这样做:

SELECT firstname FROM contact WHERE lastname = 'wood' 
+0

我注意到,人们经常会问“如果在SQL *中表示什么”或“*在SQL中是这样那样*”。为什么这样?我明白,陈述一个SQL表达式是明确的,但这真的是一个很好的观点吗?无论如何,一个不允许在CRM数据库中,那么为什么还要打扰SQL呢?我错过了什么? –

+1

所以只是为了澄清,我**不是**建议使用直接SQL访问来解决这个问题。我使用SQL来帮助说明我的观点,因为它是一个类似的概念,但实现方式不同。另外,当执行QueryExpression时,它实际上会对数据库执行一些SQL,所以它有些相关。作为一方,您可以对CRM数据库进行一些操作,例如报告和添加索引。 –

2

查询表达式仅为您提供具有值的列,因为空值不会添加到属性字典中,因此不会传输到客户端。这就是为什么在访问属性前(或用户GetAttributeValue<T>(String)),您总是必须检查Contains。

如果您始终想知道实体上存在哪些字段,则必须使用RetrieveEntityRequest检索实体的元数据。请参阅MSDN

1

这里是搜索,并返回第一个实体为您SELECT * FROM entity WHERE someField = "1234"的方法。

private static Entity GetEntityByGuid(
    IOrganizationService service, 
    String entityLogicalName, 
    String fieldToConstrainOn, 
    Guid valuetoConstrainTo) 
{ 
    var qe = new QueryExpression(entityLogicalName) 
    { 
    ColumnSet = new ColumnSet(true) 
    }; 

    qe.Criteria.AddCondition(
    fieldToConstrainOn, ConditionOperator.Equal, valuetoConstrainTo); 

    return service.RetrieveMultiple(qe).Entities.FirstOrDefault(); 
} 

你可以把它像这样(假设new_entity是你的自定义实体的逻辑名,new_somefield是一个外键,其他一些实体的“ed5081c1-f77b-4f58-a8bf-a8fbe3fe27be的ID “):

var entity = GetEntityByGuid(
    service, "new_entity", "new_somefield", 
    new Guid("ed5081c1-f77b-4f58-a8bf-a8fbe3fe27be")); 

并访问new_somefield的名字:

String name = entity.GetAttributeValue<EntityReference>("new_somefield").Name; 
相关问题