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

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


Cats萌萌
浏览 78回答 1
1回答

倚天杖

如果您创建自己的通用对类,则可以使用它。我用Value1andValue2属性创建了一个,但如果愿意,您可以创建Key/Value代替:public class DBPair<T1, T2> {&nbsp; &nbsp; T1 v1;&nbsp; &nbsp; T2 v2;&nbsp; &nbsp; public DBPair() {&nbsp; &nbsp; }&nbsp; &nbsp; public DBPair(T1 v1, T2 v2) {&nbsp; &nbsp; &nbsp; &nbsp; this.v1 = v1;&nbsp; &nbsp; &nbsp; &nbsp; this.v2 = v2;&nbsp; &nbsp; }&nbsp; &nbsp; public T1 Value1&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; get; set;&nbsp; &nbsp; }&nbsp; &nbsp; public T2 Value2&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; get; set;&nbsp; &nbsp; }}注意:如果您需要 的某些其他功能KeyValuePair,例如成员相等性测试或哈希码生成,您将需要添加这些方法,或KeyValuePair在检索后将结果传输到新的。然后你可以像这样使用它:using (MyDataContext db = new MyDataContext(Config.CoreDBConnectionString))&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; return db.GetLookups().GetResult<DBPair<int,string>>().ToList();
打开App,查看更多内容
随时随地看视频慕课网APP