C#Linq查询以从给定的表中获取最高状态
这是我的模型,其中图表、图表状态和编码器是虚拟对象C#Linq查询以从给定的表中获取最高状态,c#,linq,C#,Linq,这是我的模型,其中图表、图表状态和编码器是虚拟对象 public class ChartHistory : ModelBase { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public long Id { get; set; } public virtual User Coder { get; set; } public virtual ChartStatus ChartSta
public class ChartHistory : ModelBase
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
public virtual User Coder { get; set; }
public virtual ChartStatus ChartStatus { get; set; }
public virtual Chart Chart { get; set; }
}
在表中,我有这样的值
CoderId ChartStatusId ChartId
1 9 2
3 10 2
1 9 45
3 10 45
3 9 43
4 10 43
6 9 41
7 9 40
我想获得所有的ChartID,但具有最高的chartStatusId
结果应该是
CoderId ChartStatusId ChartId
3 10 2
3 10 45
4 10 43
6 9 41
7 9 40
有人能帮我创建一个linq C查询吗。您可以使用
GroupBy
按ChartId
对项目进行分组,然后使用System.linq>为每个组选择chartStatusId
的Max
值
var data = from item in Ent.tableName
group item by item.Id into g
select new {
Id= g.key,
status= (from t in g select item.status).max()
};
此示例使用以下简单类:
public class Chart
{
public int ChartId { get; set; }
public int chartStatusId { get; set; }
}
然后使用GroupBy
和Max
为每个ChartId
获取一个新的项目列表,其中包含chartStatusId
的Max
值:
public static void Main(string[] args)
{
var charts = new List<Chart>
{
new Chart {ChartId = 1, chartStatusId = 1},
new Chart {ChartId = 2, chartStatusId = 1},
new Chart {ChartId = 3, chartStatusId = 1},
new Chart {ChartId = 1, chartStatusId = 2},
new Chart {ChartId = 2, chartStatusId = 2},
new Chart {ChartId = 3, chartStatusId = 2},
};
Console.WriteLine("ChartId chartStatusId");
var filtered = charts
.GroupBy(c => c.ChartId)
.Select(c => new Chart {ChartId = c.Key, chartStatusId = c.Max(i => i.chartStatusId)});
foreach (var chart in filtered)
{
Console.WriteLine($"{chart.ChartId,4}{chart.chartStatusId,11}");
}
GetKeyFromUser("\nDone! Press any key to exit...");
}
publicstaticvoidmain(字符串[]args)
{
var图表=新列表
{
新图表{ChartId=1,chartStatusId=1},
新图表{ChartId=2,chartStatusId=1},
新图表{ChartId=3,chartStatusId=1},
新图表{ChartId=1,chartStatusId=2},
新图表{ChartId=2,chartStatusId=2},
新图表{ChartId=3,chartStatusId=2},
};
Console.WriteLine(“ChartId chartStatusId”);
var过滤=图表
.GroupBy(c=>c.ChartId)
.Select(c=>newchart{ChartId=c.Key,chartStatusId=c.Max(i=>i.chartStatusId)});
foreach(过滤后的var图表)
{
WriteLine($“{chart.ChartId,4}{chart.chartStatusId,11}”);
}
GetKeyFromUser(“\n完成!按任意键退出…”);
}
输出
建议的SQL数据库结构:
using (var db = new TestEntities())
{
var dbCollection = db.Charts.ToList();
var chartCollection = dbCollection.ToLookup(x => x.ChartID);
foreach(var chart in chartCollection)
{
Console.WriteLine($"{chart.Key} | {chartCollection[chart.Key].Max(x => x.ChartStatusID)}");
}
}
如果您这样做,实体框架需要一个主键才能正常工作
针对SQL表使用EntityFramework的代码:
using (var db = new TestEntities())
{
var dbCollection = db.Charts.ToList();
var chartCollection = dbCollection.ToLookup(x => x.ChartID);
foreach(var chart in chartCollection)
{
Console.WriteLine($"{chart.Key} | {chartCollection[chart.Key].Max(x => x.ChartStatusID)}");
}
}
结果:
using (var db = new TestEntities())
{
var dbCollection = db.Charts.ToList();
var chartCollection = dbCollection.ToLookup(x => x.ChartID);
foreach(var chart in chartCollection)
{
Console.WriteLine($"{chart.Key} | {chartCollection[chart.Key].Max(x => x.ChartStatusID)}");
}
}
据我所知,您只添加虚拟对象来链接实体吗?
因此,如果需要LINQ查询,第一步必须是添加CoderId、ChartStatusId、ChartId的属性
public class ChartHistory : ModelBase
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[ForeignKey("Coder")]
public int CoderId { get; set; }
[ForeignKey("ChartStatus")]
public int ChartStatusId { get; set; }
[ForeignKey("Chart")]
public int ChartId { get; set; }
public virtual User Coder { get; set; }
public virtual ChartStatus ChartStatus { get; set; }
public virtual Chart Chart { get; set; }
}
然后添加迁移和更新数据库。如果所有名称和类型都等于当前数据库状态(或快照,如果是EF Core),则迁移应该为空。
现在,您可以访问链接实体的Id属性,因此查询将是:
(我假设上下文中名为ChartHistories的DbSet字段)
如果由于任何原因无法修改类和添加字段,则使用原始SQL查询的唯一方法是:
如果你使用
如果您使用到目前为止您得到了什么?这可能对以后的帖子有所帮助:您可以发布您确实有哪些代码存在问题吗?请参阅:ChartId和ChartStatusId是否在sql表中?公共类ChartHistory:ModelBase{public long Id{get;set;}公共虚拟用户编码器{get;set;}public virtual ChartStatus ChartStatus{get;set;}public virtual Chart Chart Chart{get;set;}在上面我将g.key设置为Chart.id的地方,我无法执行此操作…..public class ChartHistory:ModelBase{public long id{get;set;}public virtual User Coder{get;set;}公共虚拟图表状态图表状态{get;set;}公共虚拟图表图表{get;set;}在上面我将g.key设置为Chart.id的位置,我无法执行此操作…..“我无法执行此操作”没有告诉我太多。你得到了什么错误?请根据给出的答案显示你正在使用的代码,以便我们可以看到它在哪里不起作用。