2011-10-04 69 views
0

請原諒我的英語,但我會解釋我想達到的目標。標題可能含糊不清。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 

一旦工資月已經被處理,例如1月,該月的U_Pay_Process_Status字段更改爲Y(是)

對於上面的表,我將如何編寫一個linq到sql查詢來選擇第一個未處理的月份(在本例中爲四月份)?

我有這個迄今爲止

代碼是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); 

前版本濾除處理的項目之前對結果進行排序;這將使它更有效率(儘管效率是否爲重要是另一回事)如果查詢是在進程中執行的;如果這是使用將查詢轉換爲SQL或類似的LINQ提供程序,則不太可能出現問題。

+0

再次感謝喬恩斯基特。我不能只使用.FirstOrDefault(m => m.U_Pay_Process_Status ==「N」);得到結果? –

+1

只有當您確定已經訂購了幾個月時,FirstOrDefault纔會返回第一個未處理的月份,而如果您的數據庫沒有訂購,則可能不一定是您想要的那個月份。如果您的數據已經訂購,那麼再次訂購相對便宜,爲什麼不呢? – Massif

0

嘗試使用下面的方法

monthlyPeriods.FirstOrDefault()