C# 链接LINQ查询时的慢度
我正在链接LINQ查询,如下所示。我试图找出C# 链接LINQ查询时的慢度,c#,entity-framework,linq,C#,Entity Framework,Linq,我正在链接LINQ查询,如下所示。我试图找出query.ToList()缓慢的原因。SQL查询速度很快(毫秒),但代码需要一分钟。链接的原因是重用存储库功能 这里的缓慢有什么明显的原因吗 我如何优化这个 我如何检查实际执行的SQL查询 正在运行query.ToList() //客户端 var query=\u service.GetResultsByStatus(状态、bType、tType); var result=query.ToList()//执行需要很长时间 //服务功能 公共IEnum
query.ToList()缓慢的原因代码>。SQL查询速度很快(毫秒),但代码需要一分钟。链接的原因是重用存储库功能
这里的缓慢有什么明显的原因吗李>
我如何优化这个李>
我如何检查实际执行的SQL查询
正在运行query.ToList()代码>
//客户端
var query=\u service.GetResultsByStatus(状态、bType、tType);
var result=query.ToList()//执行需要很长时间
//服务功能
公共IEnumerable GetResultsByStatus(字符串状态、字符串B类型、字符串T类型){
IEnumerable结果=null;
result=repo.GetResults(bType).Where(item=>item.tStatus==status&&(tType==null | | item.tType==tType))
.选择(项=>new CustomResult{
A=项目A,
B=项目B,
});
返回结果;
}
//存储库功能(在许多地方重复使用)
公共IEnumerable GetResults(字符串B类型){
从dbContext.my_model()中的p返回
其中p.b类型等于(b类型)
选择p;
}
您的.Where(item=>item.tStatus==status&&(tType==null | | | item.tType==tType))
和.Select
正在您的电脑上“本地”完成。。。SQL将返回大量无用的行和列,然后在您的PC上进行“过滤”
public IEnumerable<my_model> GetResults(string bType) {
return from p in dbContext.my_model()
where p.bType.Equals(bType)
select p;
}
public IEnumerable GetResults(字符串B类型){
从dbContext.my_model()中的p返回
其中p.b类型等于(b类型)
选择p;
}
换成
public IQueryable<my_model> GetResults(string bType) {
public IQueryable GetResults(字符串b类型){
通常IEnumerable
表示“下游LINQ将在本地执行”;IQueryable
表示“下游LINQ将在服务器上执行”。在这种情况下,Where
和Select
是IEnumerable
中查询转换的“下游”部分。请注意(而且很容易)要将IQueryable
转换为IEnumerable
,通常不可能实现相反的操作。AsQueryable
创建一个“假”IQueryable
,它在本地执行,主要用于单元测试。您的。其中(item=>item.tStatus==status&(tType==null | item.tType==tType))
和.Select
正在您的电脑上“本地”完成。SQL将返回大量无用的行和列,然后在您的电脑上“过滤”
public IEnumerable<my_model> GetResults(string bType) {
return from p in dbContext.my_model()
where p.bType.Equals(bType)
select p;
}
public IEnumerable GetResults(字符串B类型){
从dbContext.my_model()中的p返回
其中p.b类型等于(b类型)
选择p;
}
换成
public IQueryable<my_model> GetResults(string bType) {
public IQueryable GetResults(字符串b类型){
通常IEnumerable
表示“下游LINQ将在本地执行”;IQueryable
表示“下游LINQ将在服务器上执行”。在这种情况下,Where
和Select
是IEnumerable
中查询转换的“下游”部分。请注意(而且很容易)要将IQueryable
转换为IEnumerable
,通常不可能实现相反的转换。AsQueryable
创建一个“假”IQueryable
是本地执行的,主要用于单元测试。非常感谢您的解释。该解决方案非常有效。认为拥有IEnumerable就足以延迟执行。@devnullIEnumerable
是“延迟执行”…“Where”和“When”是正交概念。数组/列表与IQueryable/IEnumerable是何时,IEnumerable与iQueryAvable是何时,非常感谢您的解释。解决方案非常有效。认为拥有IEnumerable就足以延迟执行。@devnullIEnumerable
是“延迟执行”…“Where”和“When”是正交概念。数组/列表与IQueryable/IEnumerable是When,IEnumerable与iQueryAvable是Where