如何使用 EF Core return 或仅显示来自特定列的不同值?

How to return or display distinct values only from a specific column using EF Core?

我有一个数据库 table Table 1,我需要在其中过滤包含非不同或重复值的特定列 Grade Level,我正在尝试过滤结果该列仅 return 一次或一次,其余将显示为空。

我正在使用 Entity Framework Core 使用下面的代码来实现结果,但它会 return 一个不同的行结果。

我需要实现的是,如果你引用我的数据库table,即Table 1.你可以在Grade Level栏下看到;它有重复的值。我想return从Table1中的数据到我的table中的UI类似于下面的Table 2

简而言之,我不想显示该列 (Grade Level) 中的重复值,而重复值应该为空但仍会显示该行。

这是我目前使用的代码,return 不同的行但不像 Table 2.

中的数据
var teachingPersonnel = new List<TeachingViewModel>();

var teachingPersonnel2 = context.TeachingPersonnel
                                .AsNoTracking()
                                .Where(x => x.School_Id == School_Id)
                                .Select(x => new TeachingViewModel
                                             {
                                                 Id = x.Id,
                                                 School_Id = x.School_Id,
                                                 OrderId = x.OrderId,
                                                 Grade_Level = x.Grade_Level,
                                                 Name = x.Name,
                                                 Position = x.Position,
                                             })
                                .OrderBy(x => x.OrderId);

teachingPersonnel = teachingPersonnel2.AsNoTracking()
                                      .Select(p => p.Grade_Level)
                                      .Distinct()
                                      .Select(id => teachingPersonnel2.OrderBy(p => p.OrderId)
                                                                      .FirstOrDefault(p => p.Grade_Level == id))
                                      .OrderBy(x => x.OrderId)
                                      .ToList();

return teachingPersonnel;

如何将我的代码更新为 return 结果类似于 Table 2?

这可以实现吗?谢谢

想必你的 UI 是这样的:

foreach(var t in GetTeachingPersonnel()){
  ...
  Console.Write(t.Grade);
  ...
}

像这样:

var lastGrade = null;
foreach(var t in GetTeachingPersonnel()){
  ...
  if(lastGrade != t.Grade){
    Console.WriteLine(t.Grade);
    lastGrade = t.Grade;
  }
  ...
}

这样,如果这一行的成绩与上一行不同,就会打印,否则不会打印。这样你就不必分解你的“获取数据”方法 - 在其他地方你调用该方法你可能需要该行来包含成绩信息;这更像是一个“行跨度”/数据表示类型 requirement,应该是 ui

的职权范围

如果你迫切希望你的数据层做到这一点,你可以采用类似的方法; foreach 在您创建的列表上,如果此等级与上一个等级相同,则将此等级设为 null/empty(并更新 lastGrade)

var lastGrade = null;
foreach(var t in teachingPersonnel){
  if(lastGrade == t.Grade){
    t.Grade = "";
    lastGrade = t.Grade;
  }
}

对于那些正在寻找与此场景相同的输出结果的人。我只是错过了 for 循环中的过滤条件。这是我更新的代码,它解决了我以前的问题。 代码

 string curItem1 = null;
 string curItem2 = null;
using (var context = new SchoolsContext(options))
            {
                var teachingPersonnel = new List<TeachingViewModel>();
                var teachingPersonnel2 = context.TeachingPersonnel.AsNoTracking().Where(x => x.School_Id == School_Id)
                  .Select(x => new TeachingViewModel
                  {
                      Id = x.Id,
                      School_Id = x.School_Id,
                      OrderId = x.OrderId,
                      Grade_Level = x.Grade_Level,
                      Name = x.Name,
                      Position = x.Position,
                  }).OrderBy(x => x.OrderId).ToList();

                for (int item = 0; item < teachingPersonnel2.Count(); item++)           
                {
                    curItem1 = teachingPersonnel2[item].Grade_Level;                  
                    if (curItem1 != curItem2)
                    {
                        curItem2 = teachingPersonnel2[item].Grade_Level;
                        teachingPersonnel.Add(new TeachingViewModel
                        {
                            Id = teachingPersonnel2[item].Id,
                            School_Id = teachingPersonnel2[item].School_Id,
                            OrderId = teachingPersonnel2[item].OrderId,
                            Grade_Level = teachingPersonnel2[item].Grade_Level,
                            Name = teachingPersonnel2[item].Name,
                            Position = teachingPersonnel2[item].Position,
                        });
                      
                    }                   
                    else
                    {                       
                        teachingPersonnel.Add(new TeachingViewModel
                        {
                            Id = teachingPersonnel2[item].Id,
                            School_Id = teachingPersonnel2[item].School_Id,
                            OrderId = teachingPersonnel2[item].OrderId,
                            Grade_Level = string.Empty,
                            Name = teachingPersonnel2[item].Name,
                            Position = teachingPersonnel2[item].Position,
                        });
                    }
                   
                }
              
                return teachingPersonnel;
            }
        }