Это немного многогранный вопрос, поэтому позвольте мне просто погрузиться в код с некоторым объяснением внизу.Как преобразовать анонимный тип в Dynamic LINQ в сильный тип
Пример Пример данных:
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: В приведенном выше примере, это не является динамическим. Я должен был знать, какой объект создать с новым ключевым словом. Кроме того, я должен был знать, какие поля выбрать/проектировать. Как я могу сделать это динамически? Как я могу проецировать анонимный тип на сильный тип?
например. Я думал, что смогу сделать что-то подобное, чтобы использовать сериализацию 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. Это означает, что мы не можем просто вернуть список, содержащий различные значения определенного поля (например, для того, чтобы клиент мог создавать значения выпадающего списка для фильтрации данных).
Я использую это: https: // www. nuget.org/packages/System.Linq.Dynamic.Library/ – Raymond
И у Скотта Гу есть блог: http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic- запрос-библиотека – Raymond