2015-11-30 78 views
0

我正在爲我的應用程序構建一個篩選器,允許用戶篩選多個屬性上的自定義對象集合。爲了清晰起見,我提供了一個屏幕截圖,我正在實施的是左上角的淺藍色控制: enter image description here基於UI輸入動態構建linq查詢

想法是,對於每個選中複選框並填寫文本的字段,子查詢將被添加到搜索中,並由「AND」加入。我需要對子查詢進行相當精細的控制,因爲它們有其特定的細節。例如,「ON優美」爲目標對象上的字符串列表,所以查詢應該是這樣的:

Where(k => k.OnYomi.Contains(tb_OnYomi.Text)) 

「意」希望做一個全文檢索,類似String.Contains或LIKE, 「筆畫計數」將需要一些解析,因爲它必須支持範圍,例如,如果您鍵入5-8,則查詢應該如下所示:(x> = 5 & & x < = 8)。 「其他」需要根據組合框中的哪個值選擇不同的屬性。

我發現這個MSDN上,並坦率地說,我不能做它的正面或反面: https://msdn.microsoft.com/en-us/library/bb882637.aspx

有人能提供一個更好的解釋或更易於理解的例子嗎?謝謝。

回答

1

表達式樹解決方案是過度殺傷。如果從IQueryable開始,則可以動態添加這樣的謂詞,然後當枚舉最後的結果時,它將僅處理一次(所有謂詞(動態)合併):

var data = sourceData.AsQueryable(); 

if (!String.IsNullOrWhiteSpace(tb_OnYomi.Text)) 
    data = data.Where(k => k.OnYomi.Contains(tb_OnYomi.Text)) 

if (!String.IsNullOrWhiteSpace(tb_KunYomi.Text)) 
    data = data.Where(k => k.KunYomi.Contains(tb_KunYomi.Text)) 

// etc 

var result = data.ToList(); // evaluates all dynamically added predicates at once. 

// display result to the user.