2011-11-01 88 views
0

我想從衆多下拉列表中獲取值,並根據所選選項構建一個where語句。如果他們沒有被選中,那麼他們應該被排除在選擇陳述之外。ASP.NET C#LINQ條件WHERE子句

這是我如何做到這一點,但我認爲它不能用linq這樣完成。

IEnumerable<IGrouping<string, Forest>> treeQuery = 

     from trees in Forest 
     if (ddlType1.SelectedValue!=null) 
     { 
      string strWhere += trees.Type1 == ddlType1.SelectedValue 
     } 
     else if (ddlType2.SelectedValue!=null) 
     { 
      string strWhere += trees.Type2 == ddlType2.SelectedValue 
     } 
     where strWhere 
     orderby trees.Nuts 
     group trees by trees.TrunkColour; 

任何幫助將不勝感激。

這是之前我加入...

IEnumerable<IGrouping<string, Forest>> treeQuery = 

     from trees in Forest 
     where trees.Type1 == "oak" 
     orderby trees.Nuts 
     group trees by trees.TrunkColour; 
+0

你的第二個例子是在進行賦值,我想你想測試相等,即你有'='當我認爲你的意思是== == –

+0

謝謝,剛剛更正。 – user1024416

+0

如果用戶從ddlType1中選擇了一個值並且ddlType2應該根據您的示例忽略ddlType2? –

回答

2

爲了您的下拉列表中的每一個,可以將條款添加到您的地方:

where (ddlType1.SelectedValue == "" || trees.Type1 == ddlType1.SelectedValue) 
    && (ddlType2.SelectedValue == "" || trees.Type2 == ddlType2.SelectedValue) 
    // && (type 3...) 
+0

非常感謝所有的答覆。這是我最終使用的解決方案。 – user1024416

1

由於這僅涉及兩個條件,你可以做一個單一的LINQ查詢這樣的例子代碼:

Forest.Where(tree => 
     (
      (ddlType1.SelectedValue == null || tree.Type1 == ddlType1.SelectedValue) && 
      (ddlType2.SelectedValue == null || tree.Type2 == ddlType2.SelectedValue) 
     )) 
     .OrderBy(tree => tree.Nuts) 
     .GroupBy(tree => tree.TrunkColour); 

雖然隨着條件數量的增加,爲了提高可讀性,將查詢拆分爲單獨的部分是值得的,因爲此格式可能會因多個變量而快速無法讀取。

7

在這種情況下,您可以使用查詢的組合性質,但不希望使用查詢表達式。所以:

// Or IEnumerable<Forest>, depending on the type involved... 
IQueryable<Forest> query = Forest; 
if (ddlType1.SelectedValue!=null) 
{ 
    query = query.Where(trees => trees.Type1 == ddlType1.SelectedValue); 
} 
else if (ddlType2.SelectedValue!=null) 
{ 
    query = query.Where(trees => trees.Type2 == ddlType2.SelectedValue); 
} 
var finalQuery = query.OrderBy(trees => tree.Nuts) 
         .GroupBy(trees => trees.TrunkColour); 

事實上這並不會執行詢問,直到你開始使用的結果 - 所以,直到你「準備好了」,你可以添加篩選,排序方式等位位。