Преобразовать таблицу данных в словарьиспользуя Generics и методы расширения - PullRequest
2 голосов
/ 16 февраля 2012

Я пытаюсь создать словарь из моей таблицы данных.В настоящее время я делаю это, сначала создавая IList, а затем перебирая List и добавляя их в словарь, индивидуально определяя свойство Primary key результирующего объекта в списке для каждого конкретного случая.

Мне было интересноесли это можно сделать с помощью шаблонов.

В настоящее время я получил следующий код, который не компилируется или не работает:

public static IDictionary<T1, T2> ToDictionary<T1,T2>(this DataTable table) where T2 : new()
{
    IList<PropertyInfo> properties = GetPropertiesForType<T2>();
    IDictionary<T1,T2> result = new Dictionary<T1,T2>();
    Dictionary<string, int> propDict = GetPropertyDictionary(properties, table);
    T1 PK;
    foreach (var row in table.Rows)
    {
        var item = CreateDictItemFromRow<T2>((DataRow)row, properties, propDict);
        result.Add(item. item); //not sure here
    }
    return result;
}

По сути, я хотел бы вызвать следующее:

Dictionary<int, MyDBClass> Items = DataTable.ToDictionary<int,MyDBClass>();

или

Dictionary<Int16,MyDBClass> Items = DataTable.ToDictionary<Int16, MyDBClass>();

Я предполагаю, что где-то мне нужно передать имя свойства первичного ключа этой функции.В противном случае я могу с уверенностью предположить, что первый столбец в моей Datatable содержит первичный ключ (хотя и небезопасно предполагать, что это всегда int (может быть короткий или байт)).

Я также понимаю, что это вполнелегко сделать это с помощью LINQ, но я до сих пор не дошел до C # и хочу изменить существующее приложение.

Помощь приветствуется.

Ответы [ 4 ]

4 голосов
/ 16 февраля 2012

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

        public static class Extensions
        {
            public static Dictionary<TKey, TRow> TableToDictionary<TKey,TRow>(
                this DataTable table,
                Func<DataRow, TKey> getKey,
                Func<DataRow, TRow> getRow)
            {
                return table
                    .Rows
                    .OfType<DataRow>()
                    .ToDictionary(getKey, getRow);
            }
        }



        public static void SampleUsage()
        {
            DataTable t = new DataTable();

            var dictionary = t.TableToDictionary(
                row => row.Field<int>("ID"),
                row => new {
                    Age = row.Field<int>("Age"),
                    Name = row.Field<string>("Name"),
                    Address = row.Field<string>("Address"),
                });
        }

Кстати, вам нужно включить сборку System.Data.DataSetExtensions.dll, чтобы использовать метод расширения поля.

Если у вас есть другие вопросы, не стесняйтесь спрашивать.

2 голосов
/ 16 февраля 2012

С большой помощью base2, вот мой законченный метод:

public static IDictionary<TKey, T> ToDictionary<TKey, T>(this DataTable table, Func<DataRow,TKey> getKey) where T : new()
{
    IList<PropertyInfo> properties = GetPropertiesForType<T>();
    IDictionary<TKey, T> result = new Dictionary<TKey, T>();
    Dictionary<string, int> propDict = GetPropertyDictionary(properties, table);
    foreach (var row in table.Rows)
    {
        var item = CreateItemFromRow<T>((DataRow)row, properties, propDict);
        TKey pk = getKey((DataRow)row);
        result.Add(pk,item);
    }
    return result;
}

, который можно назвать так:

IDictionary<Int16,DBClient> Clients = sql.GetDataTable("SELECT * FROM Clients").ToDictionary<Int16,DBClient>(r => r.Field<Int16>("PrimaryKeyField"));
1 голос
/ 16 февраля 2012

Извлечь Petapoco Позволяет извлекать из базы данных объекты CLR и списки. Это не имеет много накладных расходов.

0 голосов
/ 16 февраля 2012

Это может быть достигнуто с помощью отражения. Ссылка может помочь вам. В этом посте я попытался преобразовать набор данных в список

...