代码之家  ›  专栏  ›  技术社区  ›  jamone

这两个LINQ语句有什么区别?

  •  1
  • jamone  · 技术社区  · 14 年前

    我的代码中有第1条语句,但发现它没有给出准确的计数,正确答案是18时返回1。为了尝试调试这个问题,我在这里创建了第二个语句,计数返回18。我只是不知道这两者有什么区别。第一个似乎比较紧凑。

    我目前正在背靠背地运行这两个语句,我确信数据库不会在这两个语句之间发生变化。

    int count = (from s in surveysThisQuarter
                 where s.FacilityID == facility.LocationID
                 select s.Deficiencies).Count();
    

    VS

     var tempSurveys = from s in surveysThisQuarter
                       where s.FacilityID == facility.LocationID
                       select s;
     int count = 0;
     foreach (Survey s in tempSurveys)
         count += s.Deficiencies.Count();
    
    5 回复  |  直到 14 年前
        1
  •  7
  •   Jon Skeet    14 年前

    在第一个查询中,您选择了一组“缺陷集”并计数 你有多少整数? . 你想用它的声音来总结它们:

    int count = (from s in surveysThisQuarter
                 where s.FacilityID == facility.LocationID
                 select s.Deficiencies.Count()).Sum();
    

    或者(可能生成更好的SQL,谁知道呢)

    int count = (from s in surveysThisQuarter
                 where s.FacilityID == facility.LocationID
                 from x in s.Deficiencies
                 select x).Count();
    
        2
  •  4
  •   Binary Worrier    14 年前

    这是因为第二个片段是缺陷计数的总和,而第一个片段是缺陷计数。
    这与您的第二个代码片段相同

    int count = (from s in surveysThisQuarter 
                 where s.FacilityID == facility.LocationID 
                 select s.Deficiencies.Count()).Sum(); 
    
        3
  •  1
  •   Marcelo Cantos    14 年前

    第一个表单是计算匹配行的数量。您应该改为使用SUM扩展方法。

        4
  •  1
  •   Kirk Broadhurst    14 年前

    第一个是返回 Count 关于一个 IEnumerable<Deficiencies> (或任何类型的缺陷)。结果将与 surveysThisQuarter.Count() . 这是因为结果实际上是集合的集合。

    第二个问题是计算所有的缺陷——这可能是你想要的。

    为了第一次正确的工作,你需要 SelectMany 而不是 Select 把你的收藏展平。

        5
  •  1
  •   Benjamin Podszun    14 年前

    我最好的猜测是:

    数数!=和

    你想要的是 .Count ?