-1

我之前在这里问过一个类似的问题,答案解决了我的问题。但是,现在我遇到了和以前一样的问题,但是由于条件的变化,答案不再起作用。

这是我正在运行的查询。我已经检查了它someField是否设置为某些东西(它是一个由 guid 引用其他实体的查找字段)。我没有得到任何条目result(除非我将条件切换为“不等于”)。这可能是由于没有引入该领域。

当我对执行进行断点并检查Attributes时,我看到总共 30 个字段中有 21 个字段(其中一些可能是空的,当然,但是这个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);

我错过了什么,我该如何解决?

我尝试使用此博客LinkEntities中讨论的方法,但并没有真正奏效。我什至不确定这是否是一种有意义的方法。它看起来如下。

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

我还尝试采用MSDN 上建议的解决方案。同样的结果。

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

再一次 - @JamesWood 提供的解决方案不再起作用,因为我拥有管理员访问权限并且相关字段不为空。

4

3 回答 3

2

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

如果您总是想知道实体上存在哪些字段,则必须使用RetrieveEntityRequest. 请参阅MSDN

于 2012-10-28T19:37:32.533 回答
1

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

从你在这里所说的:

结果中没有条目(除非我将条件切换为“不等于”)

当您将过滤器设置为“相等”时,没有任何东西等于该 Guid,因此您不会得到任何结果。

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

由于我不确定确切的问题,我建议采取以下步骤:

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

这里有一个使用查找进行过滤的示例。

作为旁注;您实际上不必在ColumnSet要用于过滤的列中指定。

例如在 SQL 中你可以这样做:

SELECT firstname FROM contact WHERE lastname = 'wood'
于 2012-10-28T22:47:50.177 回答
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是 id 为“ed5081c1-f77b-4f58-a8bf-a8fbe3fe27be”的其他实体的外键):

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;
于 2012-10-29T13:22:49.863 回答