Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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查询以从给定的表中获取最高状态_C#_Linq - Fatal编程技术网

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的位置,我无法执行此操作…..“我无法执行此操作”没有告诉我太多。你得到了什么错误?请根据给出的答案显示你正在使用的代码,以便我们可以看到它在哪里不起作用。