Сбор метаданных в таблицу

#c# #.net #linq #datatable

#c# #.net #linq #datatable

Вопрос:

У меня есть табличные данные, которые проходят через программу на C #, для которой мне нужно собрать некоторые метаданные перед завершением. Метаданные всегда подсчитываются на основе полей данных. Кроме того, мне нужно, чтобы все они были сгруппированы по одному полю в данных. Периодически мне нужно добавлять новые значения в эту коллекцию метаданных.

Я некоторое время изучал это, и я думаю, что имеет смысл переработать мою программу для хранения данных в виде DataTable , а затем запускать запросы LINQ к таблице. Проблема, с которой я сталкиваюсь, заключается в возможности поместить разные значения в одну табличную структуру, а затем записать это.

Я мог бы выполнить запрос, подобный этому:

 var query01 = 
    from record in records.AsEnumerable()
    group record by record.Field<String>("Association Key") into associationsGroup
    select new { AssociationKey = associationsGroup.Key, Count = associationsGroup.Count<DataRow>() };
  

Чтобы получить количество всех записей, сгруппированных по ключу ассоциации полей. Мне понадобится другое количество, сгруппированное таким же образом:

 var query02 =
    from record in records.AsEnumerable()
    where record.Field<String>("Number 9") == "yes"
    group record by record.Field<String>("Association Key") into associationsGroup
    select new { AssociationKey = associationsGroup.Key, Number9Count = associationsGroup.Count<DataRow>() };
  

И так далее.

Я думал о попытке Union объединить запросы в цепочку, но у меня возникли проблемы с их объединением, поскольку я проектирую анонимные типы. Я не мог понять, как сделать это по-другому, чтобы объединение работало лучше.

Итак, как я могу собрать свои метаданные в одну табличную структуру?

Ответ №1:

Объединение не выполняется, потому что у вас разные типы. Добавьте Number9Count и Count к обоим анонимным типам и повторите попытку объединения.

Ответ №2:

В итоге я решил проблему, создав класс, который содержит необходимый мне набор записей в качестве DataTable . Пользователь может добавлять запросы с помощью метода, принимая аргумент Func<DataRow, bool> . Метод создает запрос, предоставляющий этот аргумент в качестве предложения where, сохраняя ту же группировку и свойства в результирующем объекте с анонимным типом.

При получении результатов класс выполняет итерацию по каждому сохраненному запросу и вводит результаты в новый DataTable .