[英]Populating KeyValuePair from stored procedure with IMultipleResults fails due to parameterless constructor
我试图找到一种很好的方法来获取所有查找结果,这些查找结果在一次数据库旅行中就使用下拉列表填充了下拉列表,并且使用了泛型,因此我不必创建一堆自定义类。 我想避免创建一堆自定义类,例如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
但是我总是遇到序列化问题。 我正在处理的应用程序很旧,因此它使用Linq to SQL代替了Entity Framework。
因此,有没有一种方法可以在不创建一堆类的情况下进行操作,最好不要在C#/。NET中内置使用泛型的类,并允许我一次获得多个结果集?
如果创建自己的通用对类,则可以使用它。 我用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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.