如何使用 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;
}
}
我有一个数据库 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;
}
}