#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
.