Linq to DataTable без перечисления полей - PullRequest
1 голос
/ 02 декабря 2009

Я пытаюсь запросить объект DataTable без указания полей, например:

var linqdata = from ItemA in ItemData.AsEnumerable()
select ItemA

но возвращаемый тип -

System.Data.EnumerableRowCollection<System.Data.DataRow>

и мне нужен следующий тип возврата

System.Data.EnumerableRowCollection<<object,object>>

(как стандартный анонимный тип)

Есть идеи? Спасибо

Ответы [ 2 ]

4 голосов
/ 02 декабря 2009

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

анонимный тип выглядит как некий вариант или динамический объект , но на самом деле это строго типизированный класс, определенный во время компиляции. .NET автоматически определяет тип для вас. Для того чтобы .net мог это сделать, он должен иметь некоторую подсказку из кода, с помощью которой можно вывести определение типа. Это должно иметь что-то вроде:

from ItemA in ItemData.AsEnumerable()
select ItemA.Item("Name"), ItemA.Item("Email") 

так что он знает, какие члены определить. Нет способа обойти это, информация должна быть логически для определения анонимного типа.

В зависимости от того, почему именно вы пытаетесь это сделать, есть несколько вариантов.

  • Если вы хотите использовать intellisense при инкапсуляции доступа к данным, вы можете вернуть xml вместо данных из вашего класса инкапсулированного доступа к данным. (Вы можете очень легко преобразовать таблицы данных в xml. Вы захотите использовать новые классы System.Xml.Linq , такие как XElement . Они великолепны!) Тогда вы можете использовать способность VS2008 для создания схемы xsd из xml. Затем используйте / импортируйте эту схему в верхней части вашей кодовой страницы, и вы получите intellisense.
  • Если вам нужен объект со свойствами для ваших данных, но вы не хотите определять класс / структуру для них, вам понравятся новые динамические объекты в C # 4.0 / VB10. У вас есть свойства объекта, основанные на том, что возвращает sql, но у вас не будет intellisense. Это также связано с затратами на производительность, но (а) это может не иметь значения для вашей ситуации и (б) в некоторых ситуациях это не так уж и плохо.
  • Если вы просто пытаетесь избежать создания множества классов, подумайте об определении структур / структур в одном и том же файле кода под определением вашего класса. Когда вы добавляете больше столбцов в набор результатов, легко настроить структуру с помощью более открытых полей.

Короче говоря, вы можете иметь любые два из следующих трех: (а) динамические, (б) объекты с типизированной лицевой частью, (3) интеллектуальный смысл. Но не все три.

0 голосов
/ 03 декабря 2009

Есть один способ выполнить то, что вы хотите, но он требует знания динамического linq. Вы должны построить запрос во время выполнения, а затем использовать его. Я не эксперт и никогда по-настоящему не играл с этим, но вот ссылка на блог Скотта Гатри об этом - Dynamic Linq . Надеюсь, это поможет.

Wade

...