2011-10-12 99 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(...)畢竟是調用。