Запрос C # Linq для выбора лучшего результата при выполнении условия

#c# #linq

#c# #linq

Вопрос:

Извините за мой английский, но я объясню, чего я пытаюсь достичь. Название может быть расплывчатым.

Я разрабатываю программу расчета заработной платы, и мне нужно было запросить ежемесячную таблицу, чтобы выбрать месяц для обработки с использованием linq. Это для надстройки SAP Business 1.

Моя ежемесячная таблица (сокращенная)

 Code    U_Month    U_Pay_Process_Status
1       Jan        Y
2       Feb        Y
3       March      Y
4       April      N
5       May        N
6       June       N
7       July       N
8       Aug        N
9       Sept       N
10      Oct        N
11      Nov        N
12      Dec        N
  

После обработки месяца расчета заработной платы, например, января, поле U_Pay_Process_Status для этого месяца изменяется на Y (да)

Для приведенной выше таблицы, как бы я написал запрос linq to sql, чтобы выбрать первый необработанный месяц (в данном случае апрель)?

У меня есть это до сих пор

Code — это автоматически сгенерированный первичный ключ в SAP, и он имеет тип varchar.

 // Get service instance needed
var monthlyPeriodService = Program.Kernel.Get<IMonthlyPeriodService>();

//Query database monthly periods
var monthlyPeriods = monthlyPeriodService.GetAllMonthlyPeriods().OrderBy(m => m.Code);

To do.......
  

Как мне получить первый необработанный месяц. Любая помощь приветствуется.

Ответ №1:

Как насчет чего-то вроде:

 var firstUnprocessed = monthlyPeriodService.GetAllMonthlyPeriods()
                                           .Where(m => !m.Processed)
                                           .OrderBy(m => m.Code)
                                           .FirstOrDefault();
  

Обратите внимание, что это вернет значение null, если все периоды были обработаны (это то, что OrDefault бит делает для вас).

Альтернативно:

 var firstUnprocessed = monthlyPeriodService.GetAllMonthlyPeriods()
                                           .OrderBy(m => m.Code)
                                           .FirstOrDefault(m => !m.Processed);
  

Первая версия отфильтровывает обработанные элементы перед упорядочением результатов; это сделает его более эффективным (хотя, является ли эффективность значительной или нет, это другой вопрос), если запрос выполняется в процессе; если при этом используется поставщик LINQ, который преобразует запрос в SQL или что-то подобное, этовряд ли это имеет значение.

Комментарии:

1. Еще раз спасибо, Джон Скит. Я не могу просто использовать. FirstOrDefault(m => m.U_Pay_Process_Status == «N»); чтобы получить результат?

2. только если вы можете быть уверены, что месяцы уже упорядочены, FirstOrDefault вернет первый необработанный месяц, к которому он приходит, который — если ваша база данных неупорядочена — может не обязательно быть тем, который вы хотите. Если ваши данные уже упорядочены, то их повторный заказ относительно дешев, так почему бы и нет?

Ответ №2:

Попробуйте использовать следующий метод

 monthlyPeriods.FirstOrDefault()