2

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

有什么方法可以在没有很多方法重载的情况下循环执行此映射?

4

1 回答 1

1

有什么方法可以在没有很多方法重载的情况下循环执行此映射?

我会说,不。

我认为你已经描述的是这样做的最好方法,考虑到你必须告诉ObjectContext它正在处理什么类型。

您可以创建一组具有多个重载的泛型函数(类似于Func<T>and 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;

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

于 2013-03-22T12:49:42.897 回答