Подтвердить что ты не робот

Консультация по дизайну. Использование DataTable или List <MyObject> для проверки общего правила

У меня около 100 000 строк общих данных. Столбцы/Свойства этих данных определяются пользователем и имеют обычные типы данных (строка, int, double, date). Будет около 50 столбцов/свойств.

У меня есть 2 потребности:

Чтобы вычислить новые столбцы/свойства с помощью выражения
например Column3 = Column1 * Column2.
В конечном счете, я хотел бы иметь возможность использовать внешние данные с помощью обратного вызова, например, Column3 = Column1 * GetTemperature
Выражение относительно просто, операции maths, sum, count и IF являются единственными необходимыми функциями.
Чтобы иметь возможность фильтровать/группировать данные и выполнять агрегации
например Сумма (Data.Column1) Где (Data.Column2 == "blah" )

Насколько я вижу, у меня есть два варианта:
1. Использование DataTable.
= > Точка 1 выше достигается с помощью DataColumn.Expression
= > Точка 2 выше достигается с помощью DataTable.DefaultView.RowFilter или DataTable.Select() и кода С#

2. Использование списка общих объектов, каждый с Dictionary < string, object > , чтобы сохранить значения.
= > Точка 1 может быть достигнута чем-то вроде NCalc
= > Точка 2 достигается с помощью LINQ
DataTable:
Pros: DataColumn.Expression is inbuilt
Cons: RowFilter & coding c# is not as "nice" as LINQ, 
      DataColumn.Expression does not support callbacks(?) 
      => workaround could be to get & replace external value when creating 
         the calculated column

GenericList:
Pros: LINQ syntax, NCalc supports callbacks
Cons: Implementing NCalc/generic calc engine

Исходя из вышеизложенного, я бы подумал, что подход GenericList победит, но что-то, что я не учитывал, - это производительность, которая по какой-то причине, я думаю, была бы лучше с datatable.
У кого-нибудь есть ощущение/опыт работы с продукцией LINQ и DataTable?
Как насчет NCalc?
Как я уже сказал, есть около 100 000 строк данных с 50 столбцами, из которых, возможно, 20 вычисляются. В общей сложности около 50 правил будут выполняться против данных, поэтому в общей сложности будет проведено 5 миллионов сканирования строк/объектов.

Был бы очень признателен за любые идеи. спасибо.
пс. Конечно, использование базы данных + SQL и представлений и т.д. Было бы самым простым решением, но по разным причинам не может быть реализовано.

4b9b3361

Ответ 1

Ну, использование DataTable не исключает использования LINQ

table.Rows.Cast<DataRow>() //IEnumerable<DataRow>, linq it to death

Этот парень дает некоторые аргументы о HashTable vs. DataTable и этот парень находит Dictionary лучше, чем DataTable, но не сильно (факторы в стоимости создания словаря).

Примечание: если столбцы известны заранее (то есть пользователь может выбрать некоторые из столбцов из предопределенного набора столбцов (имя, тип)), я бы пошел с строго типизированными классами, так как data["property"] не получить поддержку Intellisense, например data.Property.