仅选择满足第二个条件的第一个

时间:2019-05-12 14:43:29

标签: sql-server entity-framework

我有一个带有日期字段和外键的c#对象。我在这些字段上创建了一个双索引。

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; }     
}

我需要从“会话”中获取一个列表,如下所示: 我有一个病人编号清单和日期。 我需要为每个患者进行一次会议,以确保其日期是所有其他患者中最新的。

类似这样的东西:

SELECT * FROM Sessions WHERE PatientId IN (1, 2, ...) AND TOP(Date < SOME_DATE)

我知道这个查询是胡说八道。这只是为了阐明我的意图。

***使用索引很重要,因为此表很大。

如果可能,我想知道是否可以在c#和实体框架中编写它。

非常感谢!

1 个答案:

答案 0 :(得分:1)

  

***使用索引很重要,因为此表很大。

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);