#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()