有没有办法在结果集合上调用DbContext.Translate而不显式传入泛型类型?

时间:2013-03-22 12:33:14

标签: c# generics

我有一个存储过程,我通过一个返回多个结果的实体框架调用。我一直在使用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个结果集。)

有没有办法在循环中进行这种映射而不会有很多方法重载?

1 个答案:

答案 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;

如果在代码的上下文中有意义地将此功能重新分解为一组方法,我认为有多个重载是没有问题的。