来自上下文

时间:2015-12-01 03:29:21

标签: c# entity-framework

在代码中我们发现了很多重复的代码,它们从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()

1 个答案:

答案 0 :(得分:1)

您现在遇到的问题是我在使用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>

类型