2015-11-30 42 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.