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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由于无参数构造函数,使用IMultipleResults从存储过程填充KeyValuePair失败相关的知识,希望对你有一定的参考价值。

我正在尝试找到一种很好的方法来获取我在一次数据库行程中填充下拉列表并使用泛型的所有查找,因此我不必创建一堆自定义类。我想避免创建一堆自定义类,如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中的内容,它使用泛型并允许我在一次旅行中获得多个结果集?

答案

如果您创建自己的通用对类,则可以使用它。我用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();

以上是关于由于无参数构造函数,使用IMultipleResults从存储过程填充KeyValuePair失败的主要内容,如果未能解决你的问题,请参考以下文章

如何检查类型是不是提供无参数构造函数?

用户没有定义无参数构造函数[重复]

C++:调用无参数的构造函数为啥不加括号

Prism:在无参数构造函数中注入服务

两个构造函数(带 & 不带参数),无输入 -> 无参数运行。跳过上述类中的构造函数

没有为此对象定义无参数构造函数。 MVC 5