gpt4 book ai didi

c# - 如何在 Entity Framework 上使用高性能的lambda表达式

转载 作者:行者123 更新时间:2023-12-04 00:52:16 26 4
gpt4 key购买 nike

我从事 C# winforms 工作。我使用 Entity Framework 6。

在我的解决方案中,我有 2 个名称为 A.BLL 和 A.DAL 的项目。 (A.DAL 添加到 A.BLL 引用文献中)

A.DAL 项目我的方法如下:

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 项目上使用 Sum 方法):

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 项目中)时,出现异常:

There is already an open DataReader associated with this Command which must be closed first.

为了解决此异常,我将 MultipleActiveResultSets=True 添加到我的连接字符串中,此方法运行速度非常慢(例如 3 秒)。

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

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项目上)方法之间有什么区别(似乎是相同的)?

如何更改 GetSum 方法以实现高性能?

最佳答案

这个:

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;
}
}

加载完整的ml_doc从 SQL Server 本地读取表,然后执行 Where()Sum()本地操作。

这是因为您的 LINQ 表达式使用两个 Func<>代表,所以不要使用

它使用

尝试将其更改为:

public decimal Sum(Expression<Func<ml_doc, bool>> predicate, Expression<Func<ml_doc, decimal>> sumColumn)

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

关于c# - 如何在 Entity Framework 上使用高性能的lambda表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30143698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com