2013-04-16 74 views
4

我正在开发一个.NET应用程序,我需要根据条件过滤来自SQL Server 2008的数据。我的数据结构是这样的:LINQ - 过滤器重复条件

enter image description here

结果进行分组和排序的关键。默认情况下,应该为每个Key返回具有Revision null的行,但是如果revisionParameter被设置,则应该返回具有相应版本号的行。如果参数为2,则输出应为:

abc  2  FALSE 
def null TRUE 
ghj  2  FALSE 
klm null TRUE 

我该如何在LINQ中完成此操作?由于

编辑: 回应lazyberezovsky: 你的LINQ表达改写为lambda:

partial void RuleEntriesByUserSaveId_PreprocessQuery(int? UserSaveId, ref IQueryable<RuleEntry> query) 
{ 
query = query.Where(re => re.Revision == null || re.Revision == value) 
      .GroupBy(re => re.Key) 
      .Select(g => g.FirstOrDefault(x => x.Revision != null) ?? g.First()); 
} 
+4

你尝试过什么吗? –

回答

3
from r in Table 
where !r.Revision.HasValue || r.Revision.Value == value 
group r by r.Key into g 
select g.FirstOrDefault(x => x.Revision.HasValue) ?? g.First() 

这将选择有修订等于null或到指定的值或者记录。在按键分组后,我们试图找到任何具有值修改的记录(该值将等于过滤器)。如果没有修改记录,我们只需从组中取得第一条记录。

+0

感谢您的回答。我实际上在做一个LightSwitch应用程序,最简单的事情就是将它写成lambda。因此我重写了你的代码,但我没有得到它的工作。我的重写代码看起来好吗? –

+0

这比他整合的查询语言更具原生感觉;有时会让我想起使用VB.NET进行糟糕的内联-XML集成。 –

+0

@OskarEriksson你的查询对我来说看起来很好(我曾用'HaValue'属性代替与null比较)。什么不工作?例外? –