【发布时间】:2015-09-27 04:10:36
【问题描述】:
这是一个多方面的问题,所以让我深入研究代码并在底部进行一些解释。
示例样本数据:
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
但是,一个问题是我想返回一个强类型对象,在这种情况下,与输入相同的对象,在这种情况下是 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: 在上面的例子中,它不是动态的。我必须知道使用 new 关键字创建哪个对象。此外,我必须知道选择/项目哪些领域。我怎样才能动态地做到这一点?如何将匿名类型投影为强类型?
例如我想我可以做这样的事情来使用 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: 我们遇到的下一个问题是我们希望查询是动态的。 即我们想要公开一个接口,让客户端查询数据以获得他们想要的任何东西。为此,我们转向了 Dynamic 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 模型。这意味着我们不能只返回一个包含特定字段的不同值的列表(例如,让客户端创建用于过滤数据的下拉值)。
【问题讨论】:
标签: c# linq anonymous-types dynamic-linq