基于UI输入动态构建linq查询

时间:2015-11-30 23:56:21

标签: linq dynamic

我正在为我的应用程序构建一个过滤器,允许用户过滤多个属性上的自定义对象集合。为了清晰起见,我提供了截图,我正在实现的是左上方的浅蓝色控件: enter image description here

我们的想法是,对于每个选中复选框并填写文本的字段,将在搜索中添加一个子查询,并以“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

有人可以提供更好的解释或更易于理解的例子吗?谢谢。

1 个答案:

答案 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.