是否有方法调用DbContext.翻译结果集合而不显式地传递泛型类型



我有一个存储过程,我通过一个返回多个结果的实体框架调用它。我一直在使用DbContext。方法将这些结果映射回实体,如下所示:

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个结果集)。

是否有一些方法,我可以做这个映射在一个循环没有许多方法重载?

有没有办法在循环中做这个映射而不有很多方法重载?

我会说,不。

我认为你已经描述的是最好的方法,考虑到你必须告诉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;

我不认为有多重重载是有问题的,如果它是有意义的,在您的代码的上下文中,将此功能重构为一组方法。

最新更新