2011-10-04 78 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()