2011-10-12 101 views
2

这个问题可能已经回答了某处(如果有的话,我希望有链接!)。但是因为我不知道我想要做什么类型的linq查询,所以我一直无法找到任何帮助我的东西。LINQ to SQL:在哪里条件下的子过滤器

我已经有一个非常简单的查询设置来获取DomainSequences类型的所有记录。

var query = db.DomainSequences; 

有不同类型的域序列。我想要所有这些。但是,对于DomainType属性等于'AT'的记录,我只想返回一些'AT'记录(即对那些进行where子句以过滤'AT'记录但仍然要返回所有非“AT”的记载。

更简单地说,我想所有DomainSequence记录,但对于具有DomainType ==“AT”的记载,然后返回那些只有在满足一定的条件。

我能想到的做类似的东西做的一种方式:

query.Where(x => x.DomainType != "AT" || (x.DomainType == "AT" && AT conditions....)); 

我认为这应该工作,但问题是当我必须做其他子过滤器然后它开始变得更加混乱和复杂得很快。

理想情况下,我想这样做

query.Where(x => x.DomainType == "AT" || x.DomainType == "KS") 
     .WhereIf(y => y.DomainType == "AT" then apply filter on those) 
     .WhereIf(z => z.DomainType == "KS" then apply filter to these); 

我不知道是否有办法做到在LINQ或SQL这种类型的子滤波器的(虽然我想象有)。有关如何可以相对干净地完成这些建议的任何建议?

谢谢!

回答

1
query.Where(x => x.DomainType == "AT" || x.DomainType == "KS") 
    .Where(y => y.DomainType != "AT" || other filter) 
    .Where(z => z.DomainType != "KS" || other filter); 
2

这实际上并不完全与您在SQL中编写的内容完全不同。事实上,如果您尝试查询表达式语法方法,您可能会发现特定的连接更容易实现。

var query = from domain in db.DomainSequences 
      where (domain.DomainType == "AT" && domain.Foo == 42 && ...) 
       || (domain.DomainType == "KS" && domain.Foo = 117 && ...) 
      select domain; 

这很好地映射到SQL你可能会想到写

SELECT * 
FROM DomainSequences 
WHERE 
    (DomainType = 'AT' AND Foo = 42 AND ...) 
OR 
    (DomainType = 'KS' AND Foo = 117 AND ...) 

你可以,当然,使用Lambda表达式保持在流畅的扩展方法的语法,当然,这只是一个单一的.Where(...)毕竟是调用。