我有带有日期字段和外键的 ac# 对象。我在这些字段上创建了一个双索引。
public class Session : DbObject
{
[DataMember]
[Column(TypeName = "date")]
[Index(IsUnique = false, Order = 2)]
public DateTime Date { get; set; }
[DataMember]
[Index(IsUnique = false, Order = 1)]
public int PatientId { get; set; }
[DataMember]
public Patient Patient { get; set; }
}
我需要从“会话”中获取一个列表,如下所示:我有一个患者 ID 和日期列表。我需要为每位患者获取一个会话,其日期是所有其他患者中最新的。
像这样:
SELECT * FROM Sessions WHERE PatientId IN (1, 2, ...) AND TOP(Date < SOME_DATE)
我知道这个查询是无稽之谈。它只是为了澄清我的意图。
***使用索引很重要,因为这个表很大。
如果可以的话,我想知道我是否可以用c#和实体框架编写它。
非常感谢!
***使用索引很重要,因为这个表很大。
LINQ 查询类似于:
var ids = new List<int>() { 1, 2, 3 };
var dt = DateTime.Now;
var q = from s in db.Sessions
where ids.Contains(s.Id)
&& s.Date > dt
group s by s.PatientId into byPatientId
select byPatientId.OrderBy(s => s.Date).Take(1);
但这可能不是最有效的查询。如果这太慢,您可能需要考虑使用商店查询:
db.Sessions.FromSql(@"
with q as
(
select Date,
PatientId,
row_number() over (partition by PatientId order by Date desc) rn
where PatientId in (1,2,3,5,6,3)
and Date > @d
from Sessions
)
select Date, PatientId
from q
where rn = 1
", dt);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句