我有一个存储过程,我通过一个返回多个结果的实体框架调用。我一直在使用DbContext.Translate方法将这些结果映射回这样的实体:
List<T1> result1 = ObjectContext.Translate<T1>(reader).ToList();
reader.NextResult();
List<T2> result2 = ObjectContext.Translate<T2>(reader).ToList();
reader.NextResult();
List<T3> result3 = ObjectContext.Translate<T3>(reader).ToList();
reader.NextResult();
这很好用,但现在我有一个返回20多个结果的程序。我希望能够一般地映射结果,而不会创建我的方法的20个重载(因为我预见到将来会有更多的存储过程返回2-20个结果集。)
有没有办法在循环中进行这种映射而不会有很多方法重载?
答案 0 :(得分:1)
有没有办法可以在没有循环的情况下进行这种映射 有很多方法重载?
我会说,不。
我认为你已经描述的是最好的方法,考虑到你有告诉ObjectContext
它正在处理什么类型。
您可以使用包含越来越多通用参数的多个重载来创建一组通用函数(类似于Func<T>
和Action<T>
)。
例如,前两个实现可能如下所示:
public static Tuple<List<T1>> GetSprocResults<T1>
(DataTableReader reader, ObjectContext objectContext)
{
var t1 = objectContext.Translate<T1>(reader).ToList();
return new Tuple<List<T1>>(t1);
}
public static Tuple<List<T1>, List<T2>> GetSprocResults<T1, T2>
(DataTableReader reader, ObjectContext objectContext)
{
var t1 = objectContext.Translate<T1>(reader).ToList();
reader.NextResult();
var t2 = objectContext.Translate<T2>(reader).ToList();
return new Tuple<List<T1>, List<T2>>(t1, t2);
}
使用示例:
var result = GetSprocResults<DateTime, int>(reader, objectContext);
var datesCount = result.Item1.Count;
var intCount = result.Item2.Count;
如果在代码的上下文中有意义地将此功能重新分解为一组方法,我认为有多个重载是没有问题的。