Помогите с логикой ИЛИ в лямбда-запросе Linq - PullRequest
1 голос
/ 30 июня 2010

Я немного застрял в следующем запросе linq.Я пытаюсь найти все заказы, которые имеют состояние, отличное от «Завершено», или которые были выполнены в течение последнего месяца.

_ordersRepository.GetAllByFilter(
     o => o.OrderStatus
         .OrderByDescending(os => os.StatusUpdate.Date)
         .First() 

          // so at this point I have found the most recent status,
          // and I need to do something like...

          /* pseudo code */
          WHERE
              StatusUpdate.StatusType.Name != "Completed" 
          OR
              StatusUpdate.Date > DateTime.Today.AddMonths(-1)
    );

РЕДАКТИРОВАТЬ , чтобы уточнить: сложностьу меня есть то, что у меня нет прямого способа получить текущий статус, как Order.Status.Исторически статус хранится в таблице StatusUpdate.StatusUpdate подключен к Order с помощью таблицы компоновщиков OrderStatus (один ордер имеет много статусных обновлений).Поэтому, если вы посмотрите на мой приведенный выше код, вы увидите, что я обнаруживаю текущий статус с:

Order.OrderStatus.OrderByDescending(os => os.StatusUpdate.Date).First()

Это дает мне StatusUpdate соответствующийк текущему состоянию заказа.Теперь мне нужно проверить:

StatusUpdate.StatusType.Name == "Completed" // StatusType is like an enum lookup table
OR
StatusUpdate.Date > lastMonth 

Я почти могу понять, как я мог бы сделать это, но не без ужасно неэффективных действий.

1 Ответ

1 голос
/ 30 июня 2010

Я думаю, что получил это сейчас. Как будто я делаю это в своих приложениях, у меня есть таблица «Состояния», «Заказы» и «Движения», где последняя является текущей. Обновление моего примера.

DateTime dateToMatch = DateTime.Today.AddMonths(-1);
var orders = from c in Context.Orders
let currentMovement == c.Movements.OrderByDescending(x => x.PerformedOn).FirstOrDefault()
let currentStatusName == currentMovement.Status.Name
where currentStatusName != "Completed" || (currentStatusName == "Completed" && currentMovement.PerformedOn > dateToMatch)
select c;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...