由于无参数构造函数,使用IMultipleResults从存储过程填充KeyValuePair失败

时间:2019-04-09 19:25:24

标签: c# linq-to-sql

我试图找到一种很好的方法来获取所有查找信息,这些查找信息在一次数据库旅行中就使用下拉列表填充了下拉列表,并且使用了泛型,因此我不必创建一堆自定义类。我想避免创建一堆自定义类,例如Class IntStringPairClass StringStringPairClass 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 - no parameterless constructor?

但是奇怪的是,如果我只打一张桌子,它会起作用,但是如果我从存储过程中使用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,但是我总是遇到序列化问题。我正在处理的应用程序很旧,因此它使用LINQ to SQL代替了Entity Framework。

那么有没有一种方法而无需创建一堆类,最好是C#/。NET中内置的使用泛型的类,并允许我一次获得多个结果集?

1 个答案:

答案 0 :(得分:1)

如果创建自己的通用对类,则可以使用它。我使用Value1Value2属性创建了一个,但是如果需要,您可以创建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();