Взять только первое, удовлетворяющее второму условию - PullRequest
0 голосов
/ 12 мая 2019

У меня есть объект 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; }     
}

Мне нужно взять список из «Сессий» следующим образом: у меня есть список идентификаторов пациентов и дата.Мне нужно получить один сеанс для каждого пациента, чтобы его дата была самой новой из всех остальных.

примерно так:

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

Я знаю, что этот запрос - чепуха.Это просто чтобы уточнить мое намерение.

*** Важно использовать индексы, потому что эта таблица огромна.

Если это возможно, я хотел бы знать, могу ли я написать его на c # и в рамках структуры сущностей.

Большое спасибо!

1 Ответ

1 голос
/ 12 мая 2019

*** Важно использовать индексы, потому что эта таблица огромна.

Запрос 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...