Entity Framework Выберите верхнюю строку из каждого типа на основе значения подобъекта - PullRequest
0 голосов
/ 04 ноября 2019

Я использую EF6 Code First. У меня есть следующие связанные таблицы Events, Markets, MarketTypes с этими моделями

  public class Event
  {
    public Guid ID { get; set; } = Guid.NewGuid();
    public List<Market> Markets { get; set; } = new List<Market>();
  }

  public class Market
  {
    public Guid ID { get; set; } = Guid.NewGuid();
    public Guid EventID { get; set; }
    public Event Event { get; set; }
    public Guid TypeID { get; set; }
    public MarketType Type { get; set; }
    public DateTime InitiateDateTime { get; set; }
    public DateTime LastUpdateDateTime { get; set; }
    public double Value { get; set; }
  }

  public class MarketType
  {
    public Guid ID { get; set; } = Guid.NewGuid();
    public string Name { get; set; }
    public int Order { get; set; }
  }

У каждого события есть много рынков, и у каждого рынка есть один тип. Я использую следующий оператор для получения списка событий.

List<Event> events = new List<Event>();   
var startDate = new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day);   
var endDate = startDate.AddHours(24);
events = _context.Events
        .Include(e => e.Markets)
        .Include(e => e.Markets.Select(i => i.Type))
        .Where(e => e.DateTime >= startDate)
        .Where(e => e.DateTime < endDate)
        .OrderBy(e => e.DateTime)
        .ToList();

Возможно ли обновить вышеуказанный запрос, чтобы получить одну рыночную строку каждого типа, которая является последней обновленной (имеющей наибольшее значение LastUpdateDateTime)' стоимость). В настоящее время я делаю это с помощью уродливого ручного метода.

1 Ответ

0 голосов
/ 04 ноября 2019

если вам нужны последние обновленные значения, я использую в этом случае OrderByDescending, который будет сортировать список с последними.

вот так:

_context.Events
.Inlcude(e=>e.Markets)
.Include(e=>e.Markets.Select(I=>I.Type))
.Where(e=>e.DateTime>= startDate && e.DateTime<endDate)
.OrderBy(e.DateTime)
.OrderByDescending(e.LastUpdateDateTime )
.ToList();

вы не можете использовать ThenbBy linq cmd, потому что OrderBy для возрастания и конфликтует с OrderByDescending. с этим у вас есть список. После того, как вам нужен cmd First () или FirstOrDefault (), чтобы получить только самый большой. Я не уверен, но если вы используете cmd FirstOrDefault () вместо того, где cmd это может работать. это хорошо для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...