Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 链接LINQ查询时的慢度_C#_Entity Framework_Linq - Fatal编程技术网

C# 链接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

我正在链接LINQ查询,如下所示。我试图找出
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就足以延迟执行。@devnull
    IEnumerable
    是“延迟执行”…“Where”和“When”是正交概念。数组/列表与IQueryable/IEnumerable是何时,IEnumerable与iQueryAvable是何时,非常感谢您的解释。解决方案非常有效。认为拥有IEnumerable就足以延迟执行。@devnull
    IEnumerable
    是“延迟执行”…“Where”和“When”是正交概念。数组/列表与IQueryable/IEnumerable是When,IEnumerable与iQueryAvable是Where