来自上下文的动态调用存储过程
本文关键字:调用 存储过程 动态 上下文 | 更新日期: 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_GetRemittanceDetails
和SP_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>