Динамический Linq — не существует свойства или поля в типе ‘datarow’

#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();