Какой самый быстрый способ конвертировать DataTable в общий список? - PullRequest
1 голос
/ 16 августа 2011

У меня есть базовый класс, у которого есть API, который возвращает DataTable на основе идентификаторов, и мне нужно иметь объект для каждого идентификатора.

Я ненавижу работать с таблицами данных, поэтому я хотел написатькод отображения, который мне нужно только сопоставить свойства с определенными полями в таблице данных.

Есть ли более быстрый способ сделать это, чем мой пример?

Спасибо.

public abstract class BaseClass<T> where T : BaseClass<T>
{
    protected abstract T MapObject(DataRow row);

    protected abstract int SomeIdentifier { get; }

    public IList<T> GetData()
    {
        return ConvertDataTableToGenericList(GetDataTableFromOtherSource(this.SomeIdentifier));
    }

    private IList<T> ConvertDataTableToGenericList(DataTable table)
    {
        IList<T> objectList = new List<T>();
        foreach (DataRow row in table.Rows)
        {
            objectList.Add(MapObject(row));
        }
        return objectList;
    }
}

public class DerivedClass : BaseClass<DerivedClass>
{
    public int ID { get; set; }

    protected override int SomeIdentifier
    {
        get { return 1; }
    }

    protected override DerivedClass MapObject(DataRow row)
    {
        return new DerivedClass()
        {
            ID = (int)row["ID"]
        };
    }
}

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Вы можете изменить свой интерфейс для работы с IEnumerable<T> и yield return результатами.Общая производительность не увеличится, но вы можете начать быстрее обрабатывать результат.

Как пример:

private IEnumerable<T> ConvertDataTableToGenericList(DataTable table)
{
    foreach (DataRow row in table.Rows)
    {
        yield return MapObject(row);
    }
}
0 голосов
/ 16 августа 2011

Это делает то, что вы хотите, может быть, не так читабельно? Но очень лаконично. Я не эксперт LINQ, так что, возможно, это можно исправить. Кроме того, не знаю, почему вы хотите это сделать, хотя ...

//using System.Dynamic; <-- put this at the top

Linq<dynamic> list = (from r in table.AsEnumerable()
  let eo = new ExpandoObject()
  let blah = (dt.Columns.Cast<DataColumn>().All(dc => { ((IDictionary<string,object>eo).Add(dc.ColumnName, r[dc]); return true; }))
  select eo).Cast<dynamic>().ToList();

Console.WriteLine(list[0].ID); //your first ID of your DataTable.

Что ты думаешь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...