4

LINQ を使用して、Microsoft Dynamics CRM Online からアカウント タイプのエンティティを取得しています。特定のフォーマットされた値のリストをフィルタリングできません。値は正しいのですが、受信レコードがありません。私は次のように接続を作成しています:

var connection = new CrmConnection("CRMOnline");
connection.ProxyTypesEnabled = true;
CrmOrganizationServiceContext _context = new CrmOrganizationServiceContext(connection);

私はもう試した:

List<Account> items = _context.CreateQuery<Account>()
                              .Where( c => ((OptionSetValue)c["new_accreditationstatus"]).Equals(7))
                              .ToList();

List<Account> items = _context.CreateQuery<Account>()
                              .Where( c => c.GetFormattedAttributeValue("new_accreditationstatus") == "7"
                              .ToList();

List<Account> items = _context.CreateQuery<Account>()
                              .Where( c => c["new_accreditationstatus"] == "7"
                              .ToList();

最後の on は System.Format 例外をスローします。

通常のプロパティをフィルター処理します。つまり、.Where(c => c.AccountNumber.StartsWith("2010"))完全に正常に機能します。

4

4 に答える 4

4

アーリーバウンドCRMファイルを生成し( /オンラインで_____Set調べる)、のアーリーバウンド派生物(一般に呼ばれる)を作成する場合にのみ、エンティティにアクセスできます。利用可能なコンストラクターは、アーリーバウンドファイルで確認できます。crmsvcutil.exeXrm.csCrmOrganizationServiceContextXrmServiceContext

したがって、事前に(int)値(この場合は7)がわかっている場合は、他の場所で述べたようにOptionSetValue、この値を句の引数の1つとして使用できます。Where

.Where( c => c.new_AccreditationStatus.Value == 7)
于 2012-07-11T21:21:26.620 に答える
1

編集(これを試してください):

var list = _context.AccountSet.Where(c => 
                     c.FormattedValues["new_accreditationstatus"] == "7").ToList();
于 2012-07-11T16:15:28.973 に答える
1

別の素晴らしい質問ですが、残念ながら、これは Linq provider の別の失敗/「制限」を表していると思います.これは、条項の項目として許可されていますが、条項のFormattedValues許可された使用の1つとして何も言及していません. .WhereSelect

sの実際の値はエンティティにOptionSetValue格納されますが、ついでに言うと、 Linq を介してエンティティにアクセスできます。以下に例を示します。StringMapStringMap

// This query gets one permissible value for this entity and field.
var actualValue = _context.CreateQuery("stringmap")
    .Where(x => x.GetAttributeValue<string>("attributename") == "new_accreditationstatus")
    .Where(x => x.GetAttributeValue<int>("value") == "7")
    .Where(x => x.GetAttributeValue<int>("objecttypecode") == Account.EntityTypeCode)
    .Select(x => x.GetAttributeValue<string>("value"))
    .Single();

ただし、以下のように、サブクエリと元のクエリのバージョンを使用してこれを構築しようとすると、以下の例外が発生します。

var actualValues = _context.CreateQuery("stringmap")
    .Where(x => x.GetAttributeValue<string>("attributename") == "new_accreditationstatus")
    .Where(x => x.GetAttributeValue<int>("objecttypecode") == Xrm.Account.EntityTypeCode);

// This (modified) query uses the StringMap values from the previous query in
// a subquery, linking to the int (attributevalue) value that
// new_accreditationstatus represents.
List<Account> items = _context.CreateQuery<Account>()
    .Where(c => actualValues
        .Where(x => x.GetAttributeValue<int>("attributevalue") == c.new_accreditationstatus.Value)
        .Select(x => x.GetAttributeValue<string>("attributevalue"))
        .Single() == "7")
    .ToList();

...例外をスローします。

特権タイプ読み取りがエンティティ 'StringMap' で定義されていません。

もちろん、これはイライラします。なぜかというと、Linq では最初のクエリで文字列マップをクエリできるからです。

そのため、最初に "7" に対応するStringMapエンティティをクエリしてから、次のようにその値を参照する新しいクエリでその値を使用する必要があります。AttributeValue

var actualValue = _context.CreateQuery("stringmap")
    .Where(x => x.GetAttributeValue<string>("attributename") == "new_accreditationstatus")
    .Where(x => x.GetAttributeValue<int>("value") == "7")
    .Where(x => x.GetAttributeValue<int>("objecttypecode") == Account.EntityTypeCode)
    .Select(x => x.GetAttributeValue<string>("attributevalue"))
    .Single();

List<Account> items = _context.CreateQuery<Account>()
    .Where(c => c.new_accreditationstatus = new OptionSetValue(actualValue)
    .ToList();

このすべてを 1 つのクエリで実行する方法を見つけることができれば、間違いなく編集して再投稿します。

于 2012-07-11T20:26:04.343 に答える
0

オプションセットの列挙を生成する crmsvcutil 拡張を見たことがありますか?

于 2012-07-13T19:07:13.590 に答える