如何以有效的方式获得最新的子实体?

时间:2014-09-08 09:37:18

标签: c# entity-framework

我有以下EF实体:

public class Worker {
  public Int32 Id { get; set; }
  public String Name { get; set; }
  public virtual ICollection<Exam> Exams { get; set; }
}

public class Exam {
  public Int32 Id { get; set; }
  public DateTime CreatedDate { get; set; }
  public Int32 BPSystolic { get; set; }
  public Int32 BPDiastolic { get; set; }
  public virtual Worker Worker { get; set; }
}

我需要选择每个工人最近一次考试的BPSystolic和BPDiastolic。

然后我需要用它做一些计算......所以我开始查询:

context.Workers          
  .GroupBy(x => x.Worker)
  .Select(x => 
    x.OrderByDescending(y => y.Created)
    .Select(y => new { 
      BPDiastolic = y.BPDiastolic, 
      BPSystolic = y.BPSystolic }
   ).FirstOrDefault())
  .Select(z => // Calculations here)
  .ToList()

你认为这有很好的表现吗?我觉得很奇怪......

使用SelectMany可能是更好的方法吗?

我应该如何创建此查询?

1 个答案:

答案 0 :(得分:0)

另一种方法,例如:

from
    e in (
        from
            p in Exams
        select  new { 
            o = (p.CreatedDate.Value.Year * 10000 + 
                 p.CreatedDate.Value.Month * 100 +  
                 p.CreatedDate.Value.Day).ToString() + 
                 "-" + p.BPSystolic.ToString() + 
                 "-" + p.BPDiastolic.ToString(), 
            w = p.Worker.Id }
    ) group e by e.w into g
select 
    new {
        n = g.Key,
        m = g.Max(x => x.o)
    }    

你应该为每个工人进行最后一次考试。考试被序列化为一个字符串。所以你必须反序列化它。

现在你应该比较执行计划,或者你应该在sql server级别测试perf。

PS:

  • 因为我没有你的背景我无法完全测试,但它可以在一张桌子上工作。
  • EF6。