LINQ для отображения данных в список <MyObject> - PullRequest
8 голосов
/ 16 ноября 2010

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

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

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

Спасибо, чтобы помочь новичку понять ...

Ответы [ 3 ]

21 голосов
/ 16 ноября 2010

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

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/

И это ответ на предыдущий вопрос: Преобразование DataTable в общий список в C #

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

0 голосов
/ 07 марта 2017

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

  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;
   }
0 голосов
/ 16 ноября 2010

Я бы посоветовал прочитать о ADO.NET Entity Framework .Он поддерживает то, что вы спрашиваете, и ссылка должна предоставить вам достаточную информацию и примеры:)

Существует также множество учебных пособий , посвященных теме, с которой можно начать.1007 *

...