Linq,选择每项服务的最新条目

时间:2014-02-27 13:17:20

标签: c# linq entity-framework

我有下表:

public class ServiceStatusHistory
{
    [Key]
    [Required]
    public int Id { get; set; }

    // Forenkey to service
    [Required]
    public virtual Service Service { get; set; }

    [Required]
    public ServiceStatus Status { get; set; }

    [Required]
    public string Messages { get; set; }

    [Required]
    //Time Logged in the db
    public DateTime time { get; set; }

    [Required]
    //Time the service last called the update method on the client
    public DateTime LastUpdateTime { get; set; }
}

现在我需要做一个linq查询。

为我提供一份ServiceStatusHistory对象列表,列出db中的每个服务ID,并且只有最新(最长时间)的一个(对于该服务),其中enabled = true。

这很复杂的原因是,表中的每个服务都会有多个条目。因此,Id 4的服务可以在这里有100个条目。并且会有多种服务。

这是我的尝试:

 using (var db = new EFDbContext())
            {
                var result = (from x in db.ServiceStatusHistory
                              where x.Service.Enabled == true
                              select x).FirstOrDefault();

                list =  result.toString();
            }

但我意识到我的查询只返回一个对象而不是它们的列表?

4 个答案:

答案 0 :(得分:3)

您可以按服务ID进行分组,然后选择最后一个分组。

using (var db = new EFDbContext())
{
    var results = d.ServiceStatusHistory.Where(h => h.Service.Enabled)
                                        .OrderByDescending(h => h.time )
                                        .GroupBy(h => h.Service.Id)
                                        .Select(grp => grp.FirstOrDefault()); 
}

OrderByDescending将为您提供FirstOrDefault的正确排序。 GroupBy保留传递的元素的顺序。

结果将是IEnumerable<ServiceStatusHistory>,根据班级的Service属性,您将不会重复Id。如果您的“最后一个”具有特定含义,请更改OrderByDescending

修改:要急切地包含对象,您可以使用Include extension方法:

d.ServiceStatusHistory.Include(h => h.Service)

答案 1 :(得分:0)

您可以尝试更改为:

  (from x in db.ServiceStatusHistory
                                  where x.Service.Enabled == true
                                  select x).Last();

答案 2 :(得分:0)

试试这个

(from x in db.ServiceStatusHistory
                                  where x.Service.Enabled == true
                                  select x).OrderBydescending(x => x.yourfeild).Top(1);

答案 3 :(得分:0)

db.ServiceStatusHistory
    .Where(x => x.Status.Enabled)
    .GroupBy(x => x.Service)
    .Select(x => x.OrderByDescending(y => y.time).First());