【问题标题】:How to write a count and group by month query with linq如何使用 linq 编写计数和按月分组查询
【发布时间】:2018-03-29 16:07:13
【问题描述】:

这是我在 ASP.NET Core 中使用 Entity Framework Core 的第一个 C# 应用程序,我正在尝试在 Linq 中编写以下 MySQL 查询:

SELECT districtid, COUNT(id), MONTH(registerDate)
FROM StreetCrimes
GROUP BY districtid, MONTH(registerDate)

我面临的问题是编写 linq 代码。我尝试了以下方法来接近答案:

var StreetCrimes = this.database.StreetCrimes
        .Select(s => s.district)
        .Count(s => s.id > 0)
        .GroupBy(s => s.district)
        .ThenBy(s => s.registerDate);

我们将不胜感激。

我的StreetCrime 班级:

public class StreetCrime
{
    public int id { get; set; }

    public string caseNumber { get; set; }
    public District district { get; set; }
    public DateTime registerDate { get; set; }
    public TimeSpan crimeTime { get; set; }
}

【问题讨论】:

  • 你到底想做什么?
  • @zackraiyan 我正在尝试按地区 ID 分组统计每个月的犯罪数量
  • @Debreker,看看我的解决方案,我给了你三个选项,你可以选择任何一个:)

标签: c# .net entity-framework linq


【解决方案1】:

District 需要继承 IEqualityComparer 才能使 GroupBy 工作。 linq 应该如下所示:

       var StreetCrimes = this.database.StreetCrimes
       .Where(x => x.id > 0)
       .GroupBy(s => new {district = s.district, date = s.registerDate})
       .Select(x => new { count = x.Count(), district = x.Key.district, date = x.Key.date})
       .ToList();

【讨论】:

    【解决方案2】:

    感谢@jdweng,我离答案更近了。但是我需要每个月的总金额。

            var StreetCrimes = this.database.StreetCrimes
            .Where(x => x.id > 0)
            .GroupBy(s => new {district = s.district, date = s.registerDate.Month})
            .Select(x => new { count = x.Count(), district = x.Key.district, date = x.Key.date})
            .ToList();
    

    【讨论】:

      【解决方案3】:

      你可以使用 LINQ

        var StreetCrimes = this.database.StreetCrimes
         .Where(x => x.id > 0)
         .GroupBy(s => new {district = s.district, date = s.registerDate})
         .Select(x => new { count = x.Count(), district = x.Key.district, date = x.Key.date})
         .ToList();
      

      但您也可以使用DataTable

      SqlCommand cmd = new SqlCommand("SELECT districtid,COUNT(id),MONTH(registerDate) FROM StreetCrimes GROUP BY districtid,MONTH(registerDate)",connectionString)
      
      DataTable dt = new DataTable();
      SqlDataAdapter ada = new SqlDataAdapter(cmd);
      ada.Fill(dt)
      int crimeCount = dt.Rows.Count();
      

      或者两行就可以了:

       SqlCommand cmd = new SqlCommand("SELECT districtid,     COUNT(id),MONTH(registerDate) FROM StreetCrimes GROUP BY districtid,MONTH(registerDate)",connectionString)
      
       int crimeCount = CInt(cmd.ExecuteScalar());
      

      【讨论】:

        【解决方案4】:

        这应该可行:

        var StreetCrimes = this.database.StreetCrimes
               .Where(x => x.id > 0)
               .GroupBy(s => new {district = s.district, month = s.registerDate.Month})
               .Select(x => new { count = x.Count(), district = x.Key.district, month = x.Key.month})
               .ToList();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-28
          • 1970-01-01
          • 2015-02-06
          相关资源
          最近更新 更多