LINQ для сопоставления таблицы данных со списком‹MyObject›

Я только что открыл для себя LINQ, поэтому будьте со мной исчерпывающими, пожалуйста! :-)

Так! У меня есть уровень данных, который предоставляет мне таблицы данных, и я хочу преобразовать их в списки объектов. Эти объекты определены в конкретном слое DTO (Объекты передачи данных).

Как я могу сопоставить все строки моей таблицы данных с объектами и поместить все объекты в список? (сегодня я делаю это "вручную" поле за полем) Возможно ли это с LINQ? Я слышал о LINQ2Entities? я прав?

Спасибо за помощь новичку в понимании...


person bAN    schedule 16.11.2010    source источник


Ответы (3)


Если объекты не слишком сложны, вы можете использовать это:

public static class DataTableExtensions
{
   public static IList<T> ToList<T>(this DataTable table) where T : new()
   {
      IList<PropertyInfo> properties = typeof(T).GetProperties().ToList();
      IList<T> result = new List<T>();

      foreach (var row in table.Rows)
      {
         var item = CreateItemFromRow<T>((DataRow)row, properties);
         result.Add(item);
      }

      return result;
   }

   private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) where T : new()
   {
       T item = new T();
       foreach (var property in properties)
       {
           property.SetValue(item, row[property.Name], null);
       }
       return item;
   }
}

Теперь вы можете написать: var list = YourDataTable.ToList<YourEntityType>().

Вы можете прочитать об этом здесь: http://blog.tomasjansson.com/convert-datatable-to-generic-list-extension/

И это ответ на предыдущий вопрос: Convert DataTable to Generic List in C#< /а>

EDIT: я должен добавить, что это не linq, а некоторые методы расширения для DataTable, которые я написал. Кроме того, он работает с соглашением о том, что свойства в объекте, с которым вы сопоставляете, имеют то же имя, что и в DataTable. Конечно, это может быть расширено для чтения атрибутов свойств, или сам метод может принимать простой Dictionary<string,string>, который можно использовать для сопоставления. Вы также можете расширить его с помощью некоторых функций, которые принимают params string[] excludeProperties, которые можно использовать для исключения некоторых свойств.

person Tomas Jansson    schedule 16.11.2010
comment
Отлично, кажется, это именно то, что я хочу сделать! Но это класс, который я должен написать? почему DataTableExtensions не наследуется от DataTable? - person bAN; 16.11.2010
comment
Он не наследуется, так как это метод расширения, поэтому он работает для всех таблиц данных. Предоставленный мной код — это просто то, что я собрал для своих нужд, вам может понадобиться добавить дополнительные функции, такие как проверка нуля и часть, которую я написал в разделе EDIT. Просто включите свое пространство имен расширений в файл, который вы хотите использовать, и он должен работать... как по волшебству :) Кроме того, если он отвечает, ваш вопросительный знак находится в состоянии ответа. - person Tomas Jansson; 16.11.2010
comment
Пока вы знаете о соглашении, согласно которому свойства сопоставляются со столбцами, все должно быть в порядке. Если вам нужно что-то наоборот, то есть от IList<T> до DataTable, у меня есть это в моем блоге на blog.tomasjansson.com. - person Tomas Jansson; 16.11.2010


лучше проверить, существует ли столбец в строке, чтобы выполнить сопоставление по-другому, это вызовет исключение, в моем случае у меня есть два объекта, один из которых имеет больше свойств, чем другой, с тем же именем и типом данных

  private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) where T : new()
   {
       T item = new T();
       foreach (var property in properties)
       {  
           if (row.Table.Columns.Contains(property.Name))
           {
           property.SetValue(item, row[property.Name], null);
           }
       }
       return item;
   }
person Mohammed Al-said    schedule 07.03.2017