#dynamic-linq
#dynamic-linq
Вопрос:
Я использую таблицу Northwind Customers, где я заполняю набор данных и получаю datatable.
Я пытаюсь использовать динамический linq и хочу динамически выбирать ColumnName
var qry = MyDataTable.AsEnumerable().AsQueryable().Select("new(Country)");
Прямо сейчас у меня жестко закодированная страна, но даже тогда я получаю эту ошибку
No property or field 'Country' exists in type 'datarow'
Я хотел бы в конечном итоге изменить этот запрос, чтобы динамически принимать имя столбца.
Пожалуйста, помогите!!! Спасибо.
Комментарии:
1. Вы можете указать, что Слаума предоставил правильный ответ, нажав на галочку рядом с его ответом.
Ответ №1:
Важный намек здесь (выделен жирным шрифтом):
В типе ‘datarow’ не существует свойства или поля ‘Country’
Метод расширения AsEnumerable
DataTable
класса возвращает an, IEnumerable<T>
где T имеет тип DataRow
. Теперь Select
метод Dynamic LINQ хочет работать с этим типом DataRow
, у которого, конечно, нет свойства Country
.
Вы могли бы попробовать это вместо:
var qry = MyDataTable.AsEnumerable().AsQueryable()
.Select("new(it["Country"] as CountryAlias)");
it
теперь представляет переменную типа DataRow
, и вы можете использовать методы этого типа и, возможно, также индексатор в моем примере выше. (Динамический LINQ поддерживает доступ к элементам массива по целочисленному индексу, но я не уверен, будет ли работать доступ к индексатору с помощью строкового ключа.)
Комментарии:
1. Большое вам спасибо, мне просто пришлось использовать как
2. var qry = MyDataTable. AsEnumerable(). AsQueryable() .Select(«создать(это[«Country»]) как CountryAlias»);
3. Да, я также только что увидел, что
as
это необходимо. Я отредактирую свой ответ, чтобы исправить это.
Ответ №2:
Я использовал ответ Слаумы, и это сработало. Кроме того, я выполнял OrderBy с помощью dynamic linq, возможно, это кому-то поможет. Я просто оставлю код здесь.
string dynamicLinqText = $"it["{sortColumnName}"] {sortDirection}"; //it["PERSON_NAME"] asc
result = result.AsEnumerable().OrderBy(dynamicLinqText).CopyToDataTable();