Заполнение KeyValuePair из хранимой процедуры с помощью IMultipleResults завершается неудачно из-за конструктора без параметров - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь найти хороший способ получить все мои поиски, которые заполняют раскрывающиеся списки в одной поездке по БД, и используя дженерики, чтобы мне не пришлось создавать кучу пользовательских классов.Я хотел бы избежать создания нескольких пользовательских классов, таких как Class IntStringPair, Class StringStringPair, Class StringIntPair и т. Д.

Я знаю, что в C # есть KeyValuePair, поэтому я попытался использовать его, но он выдает исключение: 'System.Collections.Generic.KeyValuePair[System.Int32,System.String]' must declare a default (parameterless) constructor in order to be constructed during mapping.'

Я видел этот пост: KeyValuePair - нет конструктора без параметров?

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

Так что это работает:

using (MyDataContext db = new MyDataContext(Config.CoreDBConnectionString))
{
    return db.MyTable.Select(p => new KeyValuePair<string, string>(p.Field1, p.Field2)).ToList();
}

Но это не получается:

using (MyDataContext db = new MyDataContext(Config.CoreDBConnectionString))
{
    System.Data.Linq.IMultipleResults r = db.GetLookups();
    return r.GetResult<KeyValuePair<int,string>>().ToList();
}

Если бы я мог заставить работать эту последнюютогда у меня было бы лучшее из обоих миров, одиночное отключение БД и обобщенное решение.

Я также пробовал Dictionary, но всегда сталкиваюсь с проблемами сериализации.Приложение, над которым я работаю, старое, поэтому вместо Entity Framework оно использует Linq to SQL.

Так что есть способ сделать это без создания группы классов, желательно чего-то встроенного в C # / .NET, которыйиспользует дженерики и позволяет мне получать несколько наборов результатов за одну поездку?

1 Ответ

1 голос
/ 09 апреля 2019

Если вы создаете свой собственный общий класс пары, вы можете использовать его. Я создал один со свойствами Value1 и Value2, но вместо этого вы можете создать Key / Value, если хотите:

public class DBPair<T1, T2> {
    T1 v1;
    T2 v2;

    public DBPair() {
    }

    public DBPair(T1 v1, T2 v2) {
        this.v1 = v1;
        this.v2 = v2;
    }

    public T1 Value1
    {
        get; set;
    }
    public T2 Value2
    {
        get; set;
    }
}

ПРИМЕЧАНИЕ. Если вам нужны некоторые другие возможности KeyValuePair, такие как тестирование на равенство для всех членов или генерация хэш-кода, вам необходимо добавить эти методы или перенести результаты в новый KeyValuePair после получения.

Тогда вы можете использовать его так:

using (MyDataContext db = new MyDataContext(Config.CoreDBConnectionString))        
    return db.GetLookups().GetResult<DBPair<int,string>>().ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...