DataTable to List <object> - PullRequest
       15

DataTable to List <object>

7 голосов
/ 02 апреля 2009

Как мне взять DataTable и преобразовать его в список?

Я включил код ниже как в C #, так и в VB.NET, проблема с обоими из них заключается в том, что мы создаем новый объект для возврата данных, что очень дорого. Мне нужно вернуть ссылку на объект.

Объект DataSetNoteProcsTableAdapters.up_GetNoteRow реализует интерфейс INote.

Я использую ADO.NET вместе с .NET 3.5

c # код

public static IList<INote> GetNotes() 
{ 
    DataSetNoteProcsTableAdapters.up_GetNoteTableAdapter adapter =
        new DataSetNoteProcsTableAdapters.up_GetNoteTableAdapter(); 
    DataSetNoteProcs.up_GetNoteDataTable table =
        new DataSetNoteProcs.up_GetNoteDataTable(); 

    IList<INote> notes = new List<INote>(); 

    adapter.Connection = DataAccess.ConnectionSettings.Connection; 
    adapter.Fill(table); 

    foreach (DataSetNoteProcs.up_GetNoteRow t in table) { 
        notes.Add((INote)t); 
    } 

    return notes;
} 

Код VB.NET

Public Shared Function GetNotes() As IList(Of INote)
    Dim adapter As New DataSetNoteProcsTableAdapters.up_GetNoteTableAdapter
    Dim table As New DataSetNoteProcs.up_GetNoteDataTable

    Dim notes As IList(Of INote) = New List(Of INote)

    adapter.Connection = DataAccess.ConnectionSettings.Connection
    adapter.Fill(table)

    For Each t As DataSetNoteProcs.up_GetNoteRow In table
        notes.Add(CType(t, INote))
    Next

    Return notes
End Function

Ответы [ 6 ]

6 голосов
/ 15 мая 2009

У меня есть другой подход, на который стоит взглянуть. Это вспомогательный метод. Создайте файл пользовательского класса с именем CollectionHelper:

    public static IList<T> ConvertTo<T>(DataTable table)
    {
        if (table == null)
            return null;

        List<DataRow> rows = new List<DataRow>();

        foreach (DataRow row in table.Rows)
            rows.Add(row);

        return ConvertTo<T>(rows);
    }

Представьте, что вы хотите получить список клиентов. Теперь у вас будет следующий абонент:

List<Customer> myList = (List<Customer>)CollectionHelper.ConvertTo<Customer>(table);

Атрибуты, имеющиеся у вас в DataTable, должны соответствовать вашему классу Customer (такие как Имя, Адрес, Телефон).

Надеюсь, это поможет!

Для тех, кто хочет знать, почему использовать списки вместо таблиц данных: текст ссылки

Полный образец:

http://lozanotek.com/blog/archive/2007/05/09/Converting_Custom_Collections_To_and_From_DataTable.aspx

2 голосов
/ 02 апреля 2009

Нет, создание списка не дорого. По сравнению с созданием таблицы данных и извлечением данных из базы данных это очень дешево.

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

IList<INote> notes = new List<INote>(table.Rows.Count);
1 голос
/ 02 апреля 2009

Не уверен, что это то, что вы ищете, но вы можете попробовать что-то вроде этого.

    public class Category
{
    private int _Id;
    public int Id
    {
        get { return _Id; }
        set { _Id = value; }
    }

    private string _Name = null;
    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }

    public Category()
    {}

    public static List<Category> GetCategories()
    {
        List<Category> currentCategories = new List<Category>();

        DbCommand comm = GenericDataAccess.CreateTextCommand();
        comm.CommandText = "SELECT Id, Name FROM Categories Order By Name";
        DataTable table = GenericDataAccess.ExecuteSelectCommand(comm);

        foreach (DataRow row in table.Rows)
        {
            Category cat = new Category();
            cat.Id = int.Parse(row["Id"].ToString());
            cat.Name = row["Name"].ToString();
            currentCategories.Add(cat);
        }
        return currentCategories;
    }
}

Это то, что я сделал, поэтому надеюсь, что это поможет. Не уверен, что это правильный способ, но он работает для того, для чего он нам нужен.

1 голос
/ 02 апреля 2009

Почему бы не передать DataTable в функцию вместо ее создания? Это просто будет содержать ссылку.

Это слишком простой ответ, который будет для вас полезным, я уверен, но я не понимаю, как он не решит вашу проблему.

0 голосов
/ 02 апреля 2009

Вы хотите сослаться на строки таблицы? В этом случае вы должны использовать свойство DataTable.Rows.

Попробуйте это:

notes.AddRange(table.Rows);

Если строки таблицы реализуют INote, это должно работать.

В качестве альтернативы вы можете сделать, как вы сделали выше:

foreach (INote note in table.Rows)
{
  notes.Add(note)
}
0 голосов
/ 02 апреля 2009

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

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