別の素晴らしい質問ですが、残念ながら、これは Linq provider の別の失敗/「制限」を表していると思います.これは、条項の項目として許可されていますが、条項のFormattedValues
許可された使用の1つとして何も言及していません. .Where
Select
sの実際の値はエンティティにOptionSetValue
格納されますが、ついでに言うと、 Linq を介してエンティティにアクセスできます。以下に例を示します。StringMap
StringMap
// 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 つのクエリで実行する方法を見つけることができれば、間違いなく編集して再投稿します。