これは多面的な質問ですので、下部にいくつかの説明を付けてコードを詳しく見てみましょう。
サンプルデータ:
List<Encounter> input
Id, Facility, HospitalService, Field3, Field4, Field5, ...
1, 1, A, ..., ..., ...
2, 2, A, ..., ..., ...
3, 1, B, ..., ..., ...
4, 2, B, ..., ..., ...
5, 1, A, ..., ..., ...
5, 2, A, ..., ..., ...
私がやりたいことは、データオブジェクトをクエリして、たとえば、個別のフィールドを返すことです。
distinct Facility is 1, 2
distinct HospitalService is A, B
distinct pair is 1A, 2A, 1B, 2B
ただし、1つの得点は、強く型付けされたオブジェクト、この場合は入力と同じオブジェクト、この場合はEncounterオブジェクト、その他のすべてのフィールドが空またはデフォルト値のオブジェクトを返すことです。たとえば、
List<Encounter> output, with only fields of interest populated
Id, Facility, HospitalService, Field3, Field4, Field5, ...
0, 1, A, "", "", ""
0, 2, A, "", "", ""
0, 1, B, "", "", ""
0, 2, B, "", "", ""
標準LINQを使用すると、これを実行できます。
List<Encounter> sampleData = CreateSampleData();
List<Encounter> rawResultFromStandardLinq =
sampleData
.GroupBy(e => new {e.Facility, e.HospitalService})
.Select(e => new Encounter() { Facility = e.Key.Facility, HospitalService = e.Key.HospitalService})
.ToList();
質問1:上記の例では、動的ではありません。新しいキーワードで作成するオブジェクトを知る必要がありました。さらに、どのフィールドを選択/投影するかを知る必要がありました。これを動的に行うにはどうすればよいですか?匿名型を強い型に射影するにはどうすればよいですか?
例えば、jsonシリアライゼーションを使用するためにこのようなことができると思いました。これは機能しますが、非常に遅くなると思います。
var rawResultAsAnonymousType =
sampleData
.GroupBy(e => new { e.Facility, e.HospitalService })
.Select(e => new { e.Key.Facility, e.Key.HospitalService })
.ToList();
string json = JsonConvert.SerializeObject(rawResultAsAnonymousType);
var encountersFromJson = JsonConvert.DeserializeObject<List<Encounter>>(json);
質問2:次の問題は、クエリを動的にすることです。つまり、クライアントがデータをクエリして必要なものを取得できるようにするインターフェイスを公開する必要があります。そのために、動的LINQを使用しました。
誰かがこれを機能させるのを手伝ってくれる?
[Update: I can now do this for multiple columns]
var rawResultFromDynamicLinq4 =
DynamicQueryable
.GroupBy(_sampleData.AsQueryable(), @"new (Facility, HospitalService)", "it")
.Select("new (it.Key.Facility, it.Key.HospitalService)")
;
[Before, I was trying to do this]
var rawResultFromDynamicLinq =
sampleData
.GroupByMany("Facility", "HospitalService")
//.Select(.... how do I get my object back?)
;
いくつかの説明:
なぜこのようにするのですか?それは主に技術的な質問とは無関係ですが、知っておく必要がある場合、私はヘルスケアで働いており、FHIR標準を使用してデータをクエリしているため、定義されたFHIRモデルを使用する必要があります。これは、特定のフィールドの個別の値を含むリストを返すだけではできないことを意味します(たとえば、クライアントがデータをフィルタリングするためのドロップダウン値を作成するため)。
匿名型を強い型に射影するにはどうすればよいですか?
ええと、匿名型は強力な型です-コンパイル時に型の名前がわからないだけです(したがって「匿名」)。確かに、 別の型に射影し、AutoMapperなどのツールを使用して匿名型を別の型にマップできますが 、コンパイル時にフィールドを知る必要があります。
あなたは次のようなことができるかもしれません :
sampleData
.GroupBy(e => new {e.Facility, e.HospitalService})
.Select(g => g.First())
.ToList();
しかし、それがまさにあなたが探しているものであるかどうかは明らかではありません(さらに、コンパイル時に「グループ化」フィールドを知る必要があります)。
これを動的に行うにはどうすればよいですか?
「動的」とはどういう意味ですか?宛先タイプに基づいてプロパティを自動的に設定するものがあるのですか?
誰かがこれを機能させるのを手伝ってくれる?
繰り返しますが、各グループ化条件に一致する最初のアイテムが必要な場合は、
var rawResultFromDynamicLinq =
sampleData
.GroupByMany("Facility", "HospitalService")
.Select(g -> g.First())
;