【问题标题】:Group by LINQ Entity Framework按 LINQ 实体框架分组
【发布时间】:2018-04-16 18:33:18
【问题描述】:

我在对从数据库中检索到的数据进行分组时遇到问题,该数据由于包含我不需要的数据的列而存在重复。我试图使用 distinct 或 group by 来消除冗余。

var students= db.student.Distinct().Where(c => c.classdate== tomorrow || c.classdate== todayd).ToList();

它会返回学生的姓名,但也会根据当天可用的课程复制学生记录。我只是想获取今天和明天有课的学生列表。

我尝试过的:

students.GroupBy(x => new { x.Fn  ame, x.classdate});

上面似乎返回的结果集只有按列分组和

@model IEnumerable

似乎与返回类型不兼容。

【问题讨论】:

    标签: c# entity-framework linq


    【解决方案1】:

    如果您想要小组中的第一个学生,可以使用以下 LINQ 查询:

    students.GroupBy(x => new { x.Fname, x.classdate}).Select(grp => grp.First);
    

    这将产生一个通用的IEnumerable<T>,其中T 是您的stident 类型。

    【讨论】:

    • 使用 group by 并将结果添加到 IEnumerable 就可以了。谢谢!
    【解决方案2】:

    据我了解,您想获取今天或明天上课的所有学生姓名。如果是这种情况,您的 LINQ 表达式不准确。您的表达式应该按该顺序执行过滤、选择和区分操作。像这样的:

    db.student.Where(<condition here>).Select(<columns to select here>).Distinct(<comparer here; optional>)
    

    【讨论】:

    • 这看起来更干净,但我无法访问 Distinct 中的属性。不同的(x=>x.Fname,x.classdate)。
    • @smned 这个例子展示了比较器是如何工作的。 msdn.microsoft.com/en-us/library/bb338049(v=vs.110).aspx
    • 我会进一步检查一下,从长远来看我会需要它。谢谢!
    【解决方案3】:

    对于“distinct by”,您可以分组,然后从每个组中选择第一行。

    所以在模型中:

    return students.GroupBy(x => new { x.Fname, x.classdate}).Select(x => x.First()).ToList();
    

    在视图中:

    @model IEnumerable<student>
    

    【讨论】:

    • 请补充说明
    【解决方案4】:

    只需根据需要从学生表中选择列并使用 Distinct(),同样您的查询应该是

    var students = (来自 db.student.Where(t => t.classdate == 明天 || t.classdate == todayd 中的 objSql) select new CustomObject() { StudentName = objSql.StudentName }).Distinct().ToList();

    【讨论】:

      【解决方案5】:

      我想你应该喜欢这个。

      context.Student.Select(i => new { i.Fn, i.classdate }).Where(c => c.classdate == tomorrow || c.classdate == todayd).Distinct();
      

      如果您运行此代码,它将在数据库中生成以下查询。

      exec sp_executesql N'SELECT 
          [Distinct1].[C1] AS [C1], 
          [Distinct1].[Fn] AS [Fn], 
          [Distinct1].[classdate] AS [classdate]
          FROM ( SELECT DISTINCT 
              [Extent1].[Fn] AS [Fn], 
              [Extent1].[classdate] AS [classdate], 
              1 AS [C1]
              FROM [dbo].[Student] AS [Extent1]
              WHERE [Extent1].[classdate] IN (@p__linq__0,@p__linq__1)
          )  AS [Distinct1]',N'@p__linq__0 datetime2(7),@p__linq__1 datetime2(7)',@p__linq__0='2018-04-17 00:00:00',@p__linq__1='2018-04-16 00:00:00'
      

      【讨论】:

      • 是的,但为什么 FROM 不同?
      • “来自不同”是什么意思?我不明白。
      • 是的FROM,我的意思是select * from (select)而不是select * from Student
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多