我有以下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可能是更好的方法吗?
我应该如何创建此查询?
答案 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: