Вот вам 3 условия
var item = await _ctx.Telemetry.FirstOrDefaultAsync(x=>x.Login == model.Login && // совпадение по логину
x.PageName == topic.Title && // совпадение по имени курса
x.PageNumber == topic.Path // совпадение по пути
);
А вот вам извращенная пачка
if (!ModelState.IsValid) return BadRequest();
var now = DateTime.UtcNow;
model.Login = FixLoginNames(model.Login);
var m = await _ctx.Telemetry.OrderByDescending(x => x.End)
.FirstOrDefaultAsync(x => x.Login == model.Login &&
x.CourseId == model.CourseId &&
x.PageName == model.PageName &&
x.PageNumber == model.PageNumber);
И продолжение этого кода
try
{
var id = 0L;
model.Start = now;
var endTime = now.AddSeconds(Interval + 1);
if (model.Topics != null) await ParseTopics(model, now);
if (m == null)
{
model.End = endTime;
await _ctx.AddAsync(model);
await _ctx.SaveChangesAsync();
id = model.Id;
}
// Проверяем что это одна и та-же сессия
else if (m?.End != null && m.End > now)
{
m.End = endTime;
m.Duration = GetDuration(m);
_ctx.Telemetry.Update(m);
await _ctx.SaveChangesAsync();
id = m.Id;
}
else
{
model.End = now;
model.Duration = 0;
await _ctx.AddAsync(model);
await _ctx.SaveChangesAsync();
id = model.Id;
}
var url = Url.Action("Get", new { id });
return Created(url, new { id, url });
}