来自上下文的动态调用存储过程

本文关键字:调用 存储过程 动态 上下文 | 更新日期: 2023-09-27 18:25:17

在代码中,我们发现了许多重复的代码,这些代码从Context调用函数,然后返回列表结果。若结果为null,则返回null。否则,返回列表结果。

    public static IList<RemittanceDetail> GetDetails()
    {
        var context = StartupBusinessLogic.CreateContext();
        var sourceResult = context.SP_GetRemittanceDetails();
        if (sourceResult == null)
            return null;
        IList<RemittanceDetail> result = new List<RemittanceDetail>();
        Mapper.Map(sourceResult, result);
        return result;
    }
    public static IList<PaymentType> GetPaymentTypes()
    {
        var context = StartupBusinessLogic.CreateContext();
        var sourceResult = context.SP_GetPaymentTypes();
        if (sourceResult == null)
            return null;
        IList<PaymentType> result = new List<PaymentType>();
        Mapper.Map(sourceResult, result);
        return result;
    }

我们可以创建一个通用方法来处理这个任务吗?我关心的是如何调用上下文的动态函数

context.SP_GetPaymentTypes()

来自上下文的动态调用存储过程

您现在的问题是,在我看来,您正在使用2个函数来获取一些数据,为什么不将所有逻辑从当前函数移到SP_GetRemittanceDetailsSP_GetPaymetTypes呢。在这些函数中,您应该只返回一个列表,方法是在查询结束时调用.ToList()方法。它可能看起来像这样:

public IList<PaymentType> SP_GetPaymentTypes()
{
    using(var ctx = new StartupBusinessLogic())
    {
        var query = ctx. blablabla
        query = query.*more filtering*
        return query.ToList();
    }
 }

2条备注:

1) 最好在using语句中调用上下文,因为目前您没有处理好上下文,这很糟糕。

2) 当查询结果不包含任何内容,并且调用ToList()时,返回的List将自动为null,因此Mapping函数的检查和使用将变得过时。

要将IQueryable转换为IList,可以使用扩展方法:

public static class Extensions
{
    public static IList<T> GetList<T>(this IQueryable<T> query)
    {
        return query.ToList();
    }
}

然后你可以简单地进行

var context = StartupBusinessLogic.CreateContext();
var sourceResult = context.SP_GetRemittanceDetails().GetList();

并且结果将是类型Ilist<T>