我正在为我的应用程序构建一个过滤器,允许用户过滤多个属性上的自定义对象集合。为了清晰起见,我提供了截图,我正在实现的是左上方的浅蓝色控件:
我们的想法是,对于每个选中复选框并填写文本的字段,将在搜索中添加一个子查询,并以“AND”连接。我需要对子查询进行相当精细的控制,因为它们具有特定的功能。例如,“ON YOMI”是目标对象上的字符串列表,因此查询将如下所示:
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
有人可以提供更好的解释或更易于理解的例子吗?谢谢。
答案 0 :(得分: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.