我有下表:
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();
}
但我意识到我的查询只返回一个对象而不是它们的列表?
答案 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());