c# - 由于无参数构造函数,使用 IMultipleResults 从存储过程填充 KeyValuePair 失败
问题描述
我正在尝试找到一种好方法来获取在一次 DB 行程中填充下拉列表的所有查找并使用泛型,因此我不必创建一堆自定义类。我想避免创建一堆自定义类,如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();
}
如果我能让最后一个工作,那么我将拥有两全其美的优势,一次 DB 之旅和一个通用的解决方案。
我也尝试过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();
推荐阅读
- anylogic - SEIZE BLOCK 和优先级
- kotlin - 未调用扩展函数的模拟版本
- typescript - 获取自身的反向虚拟属性。适用于express,但不适用于nest.js
- c# - ASP.NET Core Web API - 获取文件以及 [FromBody] JSON 模型
- row-number - ROW_NUMBER 奇怪的行为结合联合
- node.js - 环回 4 @hasOne 关系
- javascript - 当我传递实际 URL 时,Img src 标记正在工作,但是当我传递 URL 的常量 instesd 时,它不起作用
- spring-boot - 如何从多个表中获取数据并放入自定义对象?弹簧靴?
- clojure - 使用 clojure 从 api 获取数据并记录结果
- python - Python程序通过防火墙windows