在代码中我们发现了很多重复的代码,它们从Context调用函数然后返回一个列表结果。如果result为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()
答案 0 :(得分:1)
您现在遇到的问题是我在使用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>