Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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到SQL,在分组行中查找最小和最大日期_C#_Linq_Group By_Min - Fatal编程技术网

C#Linq到SQL,在分组行中查找最小和最大日期

C#Linq到SQL,在分组行中查找最小和最大日期,c#,linq,group-by,min,C#,Linq,Group By,Min,我有一个大型学区数据库,我需要从中确定学期、学期和全年的开始和结束日期。每所学校可能有不同的假期(连同周末一起计算到学期开始日期),尽管不太可能。 我已经了解了学校、学校假期和每个学期的结束日期,并由此计算出每个学期的开始日期。到现在为止,一直都还不错。但有些学校有一些课程是按学期注册的,还有一些课程是全年(9月至6月)注册的。因此,我希望我最后返回的日期看起来像(这代表许多学校之一): 我得到的最接近的是这个查询(使用我计算开始日期的结果): 它正确地返回了期限,但每个期限都有一年。我需要的是

我有一个大型学区数据库,我需要从中确定学期、学期和全年的开始和结束日期。每所学校可能有不同的假期(连同周末一起计算到学期开始日期),尽管不太可能。 我已经了解了学校、学校假期和每个学期的结束日期,并由此计算出每个学期的开始日期。到现在为止,一直都还不错。但有些学校有一些课程是按学期注册的,还有一些课程是全年(9月至6月)注册的。因此,我希望我最后返回的日期看起来像(这代表许多学校之一):

我得到的最接近的是这个查询(使用我计算开始日期的结果):

它正确地返回了期限,但每个期限都有一年。我需要的是一个YR行,其中包含YR行的最小值(TermBegin)和最大值(TermEnd)。我需要对SchoolId和TermCode进行分组,并获得每个唯一代码的最小值和最大值,但我不知道如何进行

我从上面的Linq中得到的数据如下。 Min(TermBegin)YR行中的TermCodeId是我需要在结果中包含的TermCodeId

SchoolId    SchoolYear  TermCode  TermBegin    TermEnd     TermCodeId
   8CFD1    2016         TM1        08/29/2016  10/07/2016  F375E7
   8CFD1    2016         TM2        10/10/2016  11/25/2016  898EF5
   8CFD1    2016         TM3        11/28/2016  02/01/2017  F5140C
   8CFD1    2016         TM4        02/02/2017  03/10/2017  DD95B1
   8CFD1    2016         TM5        03/13/2017  05/05/2017  BE3635
   8CFD1    2016         TM6        05/08/2017  06/09/2017  2B94F0
   8CFD1    2016         YR         08/29/2016  10/07/2016  d97C9C
   8CFD1    2016         YR         10/10/2016  11/25/2016  e30980
   8CFD1    2016         YR         11/28/2016  02/01/2017  ef5de2
   8CFD1    2016         YR         02/02/2017  03/10/2017  bbe78f
   8CFD1    2016         YR         03/13/2017  05/05/2017  ca28a7
   8CFD1    2016         YR         05/08/2017  06/09/2017  2340c1

感谢您的帮助,走到这一步很有挑战性。

以下是解决此问题的方法:

  • 获取
    TermCode
    不是
    YR
  • 获取
    TermCode
    YR
    的所有记录,但按
    SchoolId
    SchoolYear
    TermCode
    TermCodeId
    对它们进行分组,并获取每组的
    Max(TermBegin)
    Max(TermEnd)
  • 对上面步骤1和步骤2中的结果执行联合
  • 步骤1

    我们只需在查询中添加一个
    where
    子句,如下所示:

    where tcd.TERM_CODE != "YR"
    
    但是让我们将查询保存在一个变量中,以便更具可读性。请注意添加了
    where
    条款:

    var excludingYr =
        from tdf in ReturnFromCalculatingStartDate
        join tcd in SCH_YR_TRM_CODES on tdf.SchoolYearTermDefGu
            equals tcd.SCHOOL_YEAR_TRM_DEF_GU
        where tcd.TERM_CODE != "YR"
        orderby tcd.TERM_CODE
        select new TermResult
        {
            SchoolId = testOrgGu,
            SchoolYear = testSchoolyear,
            TermCode = tcd.TERM_CODE,
            TermBegin = tdf.TermStartDate,
            TermEnd = tdf.TermEndtDate,
            TermCodeId = tcd.SCHOOL_YEAR_TRM_CODES_GU
        };
    
    步骤2

    我们需要添加一个
    where
    子句和一个
    groupby
    Min
    和“Max”:

    var yearRecords =
        from tdf in ReturnFromCalculatingStartDate
        join tcd in SCH_YR_TRM_CODES on tdf.SchoolYearTermDefGu
            equals tcd.SCHOOL_YEAR_TRM_DEF_GU
        where tcd.TERM_CODE == "YR"
        orderby tcd.TERM_CODE
        group tdf by new
            {
                SchoolId = testOrgGu,
                SchoolYear = testSchoolyear,
                TermCode = tcd.TERM_CODE,
                TermCodeId = tcd.SCHOOL_YEAR_TRM_CODES_GU
        } into yrs
        select new TermResult
        {
            SchoolId = yrs.Key.SchoolId,
            SchoolYear = yrs.Key.testSchoolyear,
            TermCode = yrs.Key.TermCode,
            TermBegin = yrs.Min(x => x.TermBegin),
            TermEnd = yrs.Max(x => x.TermBegin),
            TermCodeId = yrs.Key.TermCodeId
        };
    
    步骤3

    让我们执行一个
    联合

    var finalQuery = excludingYr.Union(yearRecords);
    

    因为您需要
    TermCodeId
    ,第二步将有重复记录,所以我们需要在这里做一些练习来消除重复。看看答案,看看你如何做这部分


    请注意,我无法编译或测试上述内容,因此您可能需要对其进行调整,但步骤都在那里,因为您有数据,所以不容易做到。

    以下是解决此问题的方法:

  • 获取
    TermCode
    不是
    YR
  • 获取
    TermCode
    YR
    的所有记录,但按
    SchoolId
    SchoolYear
    TermCode
    TermCodeId
    对它们进行分组,并获取每组的
    Max(TermBegin)
    Max(TermEnd)
  • 对上面步骤1和步骤2中的结果执行联合
  • 步骤1

    我们只需在查询中添加一个
    where
    子句,如下所示:

    where tcd.TERM_CODE != "YR"
    
    但是让我们将查询保存在一个变量中,以便更具可读性。请注意添加了
    where
    条款:

    var excludingYr =
        from tdf in ReturnFromCalculatingStartDate
        join tcd in SCH_YR_TRM_CODES on tdf.SchoolYearTermDefGu
            equals tcd.SCHOOL_YEAR_TRM_DEF_GU
        where tcd.TERM_CODE != "YR"
        orderby tcd.TERM_CODE
        select new TermResult
        {
            SchoolId = testOrgGu,
            SchoolYear = testSchoolyear,
            TermCode = tcd.TERM_CODE,
            TermBegin = tdf.TermStartDate,
            TermEnd = tdf.TermEndtDate,
            TermCodeId = tcd.SCHOOL_YEAR_TRM_CODES_GU
        };
    
    步骤2

    我们需要添加一个
    where
    子句和一个
    groupby
    Min
    和“Max”:

    var yearRecords =
        from tdf in ReturnFromCalculatingStartDate
        join tcd in SCH_YR_TRM_CODES on tdf.SchoolYearTermDefGu
            equals tcd.SCHOOL_YEAR_TRM_DEF_GU
        where tcd.TERM_CODE == "YR"
        orderby tcd.TERM_CODE
        group tdf by new
            {
                SchoolId = testOrgGu,
                SchoolYear = testSchoolyear,
                TermCode = tcd.TERM_CODE,
                TermCodeId = tcd.SCHOOL_YEAR_TRM_CODES_GU
        } into yrs
        select new TermResult
        {
            SchoolId = yrs.Key.SchoolId,
            SchoolYear = yrs.Key.testSchoolyear,
            TermCode = yrs.Key.TermCode,
            TermBegin = yrs.Min(x => x.TermBegin),
            TermEnd = yrs.Max(x => x.TermBegin),
            TermCodeId = yrs.Key.TermCodeId
        };
    
    步骤3

    让我们执行一个
    联合

    var finalQuery = excludingYr.Union(yearRecords);
    

    因为您需要
    TermCodeId
    ,第二步将有重复记录,所以我们需要在这里做一些练习来消除重复。看看答案,看看你如何做这部分


    请注意,我无法编译或测试上述内容,因此您可能需要对其进行调整,但这些步骤都在那里,而且由于您有数据,因此不容易操作。

    学号、学年和学期代码对它们进行分组。如果
    YR
    TermCode
    可能是
    Year
    或其他值,则首先在数据库端修复数据。找到一年中使用的所有不同代码,并使它们都相同,只有一个值:这是一个代码,所以应该是相同的。不幸的是,我无法控制数据。然而,术语代码在年份和学校是一致的,所以我删除了这一部分。我知道我需要分组,然后取最小值和最大值,但我不知道怎么做。按
    学校ID、学年和学期代码对它们进行分组。如果
    YR
    TermCode
    可能是
    Year
    或其他值,则首先在数据库端修复数据。找到一年中使用的所有不同代码,并使它们都相同,只有一个值:这是一个代码,所以应该是相同的。不幸的是,我无法控制数据。然而,术语代码在年份和学校是一致的,所以我删除了这一部分。我知道我需要分组,然后取最小值和最大值,但我不知道怎么做。谢谢你CodingYoshi,我一直在努力解决这个问题。明天当我有权访问我所有的数据时,我会试试它,并告诉你它是如何工作的。谢谢你CodingYoshi,我一直在努力解决这个问题。明天当我可以访问我的所有数据并让你知道结果时,我会尝试一下。