-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

クエリ式は、null 値がプロパティ ディクショナリに追加されず、クライアントに転送されないため、値を持つ列を提供するだけです。そのため、プロパティ (または user ) にアクセスする前に、常に Contains を確認する必要がありますGetAttributeValue<T>(String)

エンティティに存在するフィールドを常に知りたい場合は、 を使用してエンティティのメタデータを取得する必要がありますRetrieveEntityRequestそれについては、 MSDNを参照してください。

于 2012-10-28T19:37:32.533 に答える
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;
于 2012-10-29T13:22:49.863 に答える
1

ここでの問題は、あなたFilterExpressionおよび/または実際のデータ自体にあると思います。

あなたがここで言ったことから:

結果にエントリがありません(条件を「等しくない」に切り替えない限り)

フィルターを「等しい」に設定すると、その Guid と等しいものがないため、結果が得られません。

フィルターを「等しくない」に設定すると、すべてがその条件と等しくないため、結果が得られ始めます。結果が得られた場合、レコードが null であるため、ルックアップは含まれません (したがって、「等しい」フィルターが機能しない理由)。

正確な問題については確信が持てないため、次の手順を実行することをお勧めします。

  1. そのレコード タイプについては、すべてのレコードを削除します。
  2. 新しいレコードを 1 つ作成し、ルックアップ フィールドに入力します。
  3. を指定せずにAllColumns = true、そのエンティティ (例: )からすべてのフィールドを返すクエリを記述します。FilterExpression
  4. このクエリでは 1 つの結果が得られます。属性コレクションを調べて、ルックアップが入力されていることを確認してください (すべての属性をチェックして、間違った名前を取得していないことを確認してください)。
  5. 次に、クエリを拡張してFilterExpression.

ルックアップを使用したフィルタリングの例がここにあります。

補足として; ColumnSetフィルタリングに使用する列で実際に指定する必要はありません。

たとえば、SQL では次のことができます。

SELECT firstname FROM contact WHERE lastname = 'wood'
于 2012-10-28T22:47:50.177 に答える