首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在高性能实体框架上使用lambda表达式

如何在高性能实体框架上使用lambda表达式
EN

Stack Overflow用户
提问于 2015-05-09 18:43:18
回答 1查看 810关注 0票数 2

我在c# winforms工作。我使用实体框架6。

在我的解决方案中,我有两个带有A.BLL & A.DAL名称的项目。(A.DAL添加到A.BLL引用中)

A.DAL项目,我有下面的方法:

代码语言:javascript
复制
public decimal Sum(Func<ml_doc, bool> predicate, Func<ml_doc, decimal> sumColumn)
{
    try
    {
        using (dbEnteties = new Entities(Connection.CustomEntityConnection))
        {
            dbEnteties.ContextOptions.LazyLoadingEnabled = true;
            var dbe = dbEnteties.ml_doc;
            return dbe.Where(predicate).Sum(sumColumn);
        }
    }
    catch (Exception exp)
    {
        throw exp;
    }
}

我在“方法”下的A.BLL项目(在A.DAL项目上使用求和方法):

代码语言:javascript
复制
public decimal GetSum(long AccId, int? CntId, short BranchId, int BeginNumber)
{
    try
    {
        using (dal = new DAL.DocDA())
        {
            // Sum method referenced from A.DAL project
            return dal.Sum(
                x =>
                x.acc_id == AccId &&
                x.cnt_id.Equals(CntId) &&
                x.ml_doc_hdr.branch_id == BranchId &&
                x.ml_doc_hdr.number >= BeginNumber
                ,
                y => y.price);
        }
    }
    catch (Exception exp)
    {
        throw exp;
    }
}

当我使用GetSum方法(在A.BLL项目中)时,我会遇到以下异常:

已经有一个与此命令关联的开放DataReader,必须先关闭该命令。

为了解决这个异常,我将MultipleActiveResultSets=True添加到连接字符串中,此方法工作非常慢(例如,3秒)。

我在A.DAL项目上创建了下面的方法:

代码语言:javascript
复制
public decimal Sum2(long AccId, int? CntId, short BranchId, int BeginNumber)
{
    try
    {
        using (dbEnteties = new Entities(Connection.CustomEntityConnection))
        {
            dbEnteties.ContextOptions.LazyLoadingEnabled = true;
            var resultQuery = dbEnteties.ml_doc.Where(
                x =>
                x.acc_id == AccId &&
                x.cnt_id.Equals(CntId) &&
                x.ml_doc_hdr.branch_id == BranchId &&
                x.ml_doc_hdr.number >= BeginNumber
                );

            if (resultQuery.Count() != 0)
            {
                return resultQuery.Sum(x => x.price);
            }

            return 0;
        }
    }
    catch (Exception exp)
    {
        throw exp;
    }
}

当我使用高级方法(Sum2)时,这个方法工作得很好而且非常快(例如,0.003秒)。

Sum2 (关于A.DAL项目)和GetSum (关于A.BLL projetc)方法(似乎是相同的)之间有什么区别?

如何改变GetSum方法以使其具有高性能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-09 18:47:34

这个:

代码语言:javascript
复制
public decimal Sum(Func<ml_doc, bool> predicate, Func<ml_doc, decimal> sumColumn)
{
    try
    {
        using (dbEnteties = new Entities(Connection.CustomEntityConnection))
        {
            dbEnteties.ContextOptions.LazyLoadingEnabled = true;
            var dbe = dbEnteties.ml_doc;
            return dbe.Where(predicate).Sum(sumColumn);
        }
    }
    catch (Exception exp)
    {
        throw exp;
    }
}

从server本地加载完整的ml_doc表,然后在本地执行Where()Sum()操作。

这是因为LINQ表达式使用两个Func<>委托,所以没有使用

它用

尝试将其更改为:

代码语言:javascript
复制
public decimal Sum(Expression<Func<ml_doc, bool>> predicate, Expression<Func<ml_doc, decimal>> sumColumn)

相反,通过直接使用某些lambda函数,Sum2方法使用了Queryable.*方法,因为lambda函数被解释为Expression<>

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30143698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档