【问题标题】:Translating GROUP BY / MIN DATE from SQL to LINQ将 GROUP BY / MIN DATE 从 SQL 转换为 LINQ
【发布时间】:2020-08-03 11:56:57
【问题描述】:

我在将我的 SQL 转换为 LINQ 时遇到了麻烦,以便按预期处理结果......

考虑下表:

pkIdentifier fkProject fkFirst fkSecond 日期 1 1030 1 1 03.08.2020 10:05:00 2 1030 1 2 03.08.2020 10:11:00 3 1030 3 1 03.08.2020 14:00:00 4 1030 3 2 03.08.2020 14:02:00 5 1040 1 1 03.08.2020 15:00:00 6 1050 2 1 04.08.2020 08:00:00 7 1050 2 2 04.08.2020 08:10:00 8 1050 2 3 04.08.2020 08:15:00

我需要在这里找到具有最大“fkSecond”的项目 - 如果有更多条目,则找到日期最年轻的那个。

也就是说,上表的结果是:

pkIdentifier fkProject fkFirst fkSecond 日期 2 1030 1 2 03.08.2020 10:11:00 5 1040 1 1 03.08.2020 15:00:00 8 1050 2 3 04.08.2020 08:15:00

使用下面的 SQL,结果几乎与我预期的相同:

选择 ps.fkProject、ps.fkFirst、ps.fkSecond、min(ps.Date) 作为日期 FROM 项目状态 ps 内部联接 ( 选择 a.fkProject, MAX(a.fkSecond) 作为 maxSecond FROM 项目状态 按 a.fkProject 分组 ) b ON ps.fkProject = b.fkProject 和 ps.fkSecond = b.maxSecond 按 ps.fkProject、ps.First、ps.Second 分组

我在 LINQ 上的尝试,但如果有更多具有相同“fkSecond”的条目,则仅选择日期最年轻的条目:

var query = this.dataContext.ProjectStatus.Where( x => x.fkSecond == this.dataContext.ProjectStatus.Where(y => y.fkProject == x.fkProject).Max(s => s.fkSecond) );

我目前还在为 Project 1030 获得 fkSecond=2 的第二行,但这不是我想要的。我只想要日期最年轻的那个,它是 pkIdentifier 2。

pkIdentifier fkProject fkFirst fkSecond 日期 2 1030 1 2 03.08.2020 10:11:00 4 1030 3 2 03.08.2020 14:02:00 5 1040 1 1 03.08.2020 15:00:00 8 1050 2 3 04.08.2020 08:15:00

【问题讨论】:

    标签: c# sql linq


    【解决方案1】:

    见下文:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    
    namespace ConsoleApplication163
    {
        class Program
        {
            static void Main(string[] args)
            {
                DataTable dt = new DataTable();
    
                dt.Columns.Add("pkIdentifier", typeof(int));
                dt.Columns.Add("fkProject", typeof(int));
                dt.Columns.Add("fkFirst", typeof(int));
                dt.Columns.Add("fkSecond", typeof(int));
                dt.Columns.Add("Date", typeof(DateTime));
                
                dt.Rows.Add(new object[] { 1, 1030, 1, 1, new DateTime(2020, 3, 8, 10, 5, 0)});
                dt.Rows.Add(new object[] { 2, 1030, 1, 2, new DateTime(2020, 3, 8, 10, 11, 0)});
                dt.Rows.Add(new object[] { 3, 1030, 3, 1, new DateTime(2020, 3, 8, 14, 0, 0)});
                dt.Rows.Add(new object[] { 4, 1030, 3, 2, new DateTime(2020, 3, 8, 14, 2, 0)});
                dt.Rows.Add(new object[] { 5, 1040, 1, 1, new DateTime(2020, 3, 8, 15, 0, 0)});
                dt.Rows.Add(new object[] { 6, 1050, 2, 1, new DateTime(2020, 3, 8, 8, 0, 0)});
                dt.Rows.Add(new object[] { 7, 1050, 2, 2, new DateTime(2020, 3, 8, 8, 10, 0)});
                dt.Rows.Add(new object[] { 8, 1050, 2, 3, new DateTime(2020, 3, 8, 8, 15, 0)});
    
                DataTable dt2 = dt.AsEnumerable()
                    .OrderBy(x=> x.Field<int>("fkProject"))
                    .ThenByDescending (x => x.Field<int>("fkSecond"))
                    .ThenBy(x => x.Field<DateTime>("Date"))
                    .GroupBy(x => x.Field<int>("fkProject"))
                    .Select(x => x.First())
                    .CopyToDataTable();
    
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用 GroupBy,如下例所示:

      class Data
      {
          public int pkIdentifier { get; set; }
          public int fkProject { get; set; }
          public int fkFirst { get; set; }
          public int fkSecond { get; set; }
          public DateTime date { get; set; }
      }
      
      List<Data> dataList = new List<Data>();
      
      dataList.Add(new Data { pkIdentifier = 1, fkProject = 1030, fkFirst = 1, fkSecond = 1, date = new DateTime(2020, 08, 03, 10, 05, 00) });
      dataList.Add(new Data { pkIdentifier = 2, fkProject = 1030, fkFirst = 1, fkSecond = 2, date = new DateTime(2020, 08, 03, 10, 11, 00) });
      dataList.Add(new Data { pkIdentifier = 3, fkProject = 1030, fkFirst = 3, fkSecond = 1, date = new DateTime(2020, 08, 03, 14, 00, 00) });
      dataList.Add(new Data { pkIdentifier = 4, fkProject = 1030, fkFirst = 3, fkSecond = 2, date = new DateTime(2020, 08, 03, 14, 02, 00) });
      dataList.Add(new Data { pkIdentifier = 5, fkProject = 1040, fkFirst = 1, fkSecond = 1, date = new DateTime(2020, 08, 03, 15, 00, 00) });
      dataList.Add(new Data { pkIdentifier = 6, fkProject = 1050, fkFirst = 2, fkSecond = 1, date = new DateTime(2020, 08, 04, 08, 00, 00) });
      dataList.Add(new Data { pkIdentifier = 7, fkProject = 1050, fkFirst = 2, fkSecond = 2, date = new DateTime(2020, 08, 04, 08, 10, 00) });
      dataList.Add(new Data { pkIdentifier = 8, fkProject = 1050, fkFirst = 2, fkSecond = 3, date = new DateTime(2020, 08, 04, 08, 15, 00) });
      
      var groupProject = dataList.GroupBy(i => i.fkProject).Select(groupItem => groupItem.OrderByDescending(dataItem => dataItem.fkSecond).ThenBy(dataItem => dataItem.date).First());
      

      GroupBy 将按项目编号分组,然后按 fkSecond 排序,然后按日期降序排列。然后取每个组中的第一个元素。

      【讨论】:

        猜你喜欢
        • 2010-10-13
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-03
        • 1970-01-01
        • 2021-10-08
        相关资源
        最近更新 更多