我在c# winforms工作。我使用实体框架6。
在我的解决方案中,我有两个带有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项目上使用求和方法):
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项目上创建了下面的方法:
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方法以使其具有高性能?
发布于 2015-05-09 18:47:34
这个:
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<>委托,所以没有使用
Queryable.Where(this IQueryable source, Expression> predicate)Queryable.Sum(this IQueryable source, Expression> selector)它用
Enumerable.Where(this IEnumerable source, Func predicate)Enumerable.Sum(this IEnumerable source, Func selector)尝试将其更改为:
public decimal Sum(Expression<Func<ml_doc, bool>> predicate, Expression<Func<ml_doc, decimal>> sumColumn)相反,通过直接使用某些lambda函数,Sum2方法使用了Queryable.*方法,因为lambda函数被解释为Expression<>。
https://stackoverflow.com/questions/30143698
复制相似问题