链接LINQ查询时缓慢

时间:2017-06-08 10:08:39

标签: c# entity-framework linq

我正在进行链接LINQ查询,如下所示。我试图找出query.ToList();缓慢的原因。 SQL查询很快(毫秒),但代码需要一分钟。链接的原因是重用存储库功能。

  1. 这里有缓慢的明显原因吗?
  2. 我怎样才能优化这个?
  3. 如何查看执行时的实际SQL查询 正在运行query.ToList();

    //Client
    var query = _service.GetResultsByStatus(status, bType, tType);
    var result = query.ToList(); //takes a long time to execute 
    
    //Service function
     public IEnumerable<CustomResult> GetResultsByStatus(string status, string bType, string tType) {
        IEnumerable<CustomResult> result = null;
        result = repo.GetResults(bType).Where(item => item.tStatus == status && (tType == null || item.tType == tType))
            .Select(item => new CustomResult {
               A = item.A,
               B = item.B,
            });
        return result;
    }
    
    
    // Repository Function (reused in many places)
    public IEnumerable<my_model> GetResults(string bType) {
         return from p in dbContext.my_model()
             where p.bType.Equals(bType)
             select p;
    }
    

1 个答案:

答案 0 :(得分:4)

您的.Where(item => item.tStatus == status && (tType == null || item.tType == tType)).Select正在完成&#34;本地&#34;在你的PC上...... SQL返回大量无用的行和列,然后过滤&#34;在你的电脑上。

public IEnumerable<my_model> GetResults(string bType) {
     return from p in dbContext.my_model()
         where p.bType.Equals(bType)
         select p;
}

将其更改为

public IQueryable<my_model> GetResults(string bType) {

通常IEnumerable<>表示&#34;下游LINQ将在本地执行&#34;,IQueryable<>表示&#34;下游LINQ将在服务器上执行&#34;。在这种情况下,WhereSelect是&#34;下游&#34;来自IEnumerable<>中的查询转换。请注意,虽然可以(并且很容易)将IQueryable<>转换为IEnumerable<>,但通常情况并非如此。 AsQueryable<>创建了一个&#34;假的&#34; IQueryable<>在本地执行,主要用于单元测试。