基于 UI 输入动态构建 linq 查询
Dynamically building linq query based on UI input
我正在为我的应用程序构建一个过滤器,允许用户在多个属性上过滤一组自定义对象。为了清楚起见,我提供了一个屏幕截图,我正在实现的是左上角的浅蓝色控件:
想法是,对于选中复选框并填写文本的每个字段,将向搜索添加一个子查询,并由 "AND" 连接。我需要对子查询进行相当微调的控制,因为它们有自己的细节。例如,"ON YOMI" 是目标对象上的字符串列表,因此查询将如下所示:
Where(k => k.OnYomi.Contains(tb_OnYomi.Text))
"Meaning" 想要进行全文搜索,例如 String.Contains 或 LIKE,"Stroke count" 将需要一些解析,因为它必须支持范围,例如,如果您键入 5 -8,查询应如下所示:(x >=5 && x <=8)。 "Other" 需要根据在组合框中选择的值定位不同的 属性。
我在 MSDN 上找到了这个,坦率地说,我无法理解它:
https://msdn.microsoft.com/en-us/library/bb882637.aspx
有人可以提供更好的解释或更易于理解的示例吗?谢谢。
表达式树解决方案太过分了。如果您从 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.
我正在为我的应用程序构建一个过滤器,允许用户在多个属性上过滤一组自定义对象。为了清楚起见,我提供了一个屏幕截图,我正在实现的是左上角的浅蓝色控件:
想法是,对于选中复选框并填写文本的每个字段,将向搜索添加一个子查询,并由 "AND" 连接。我需要对子查询进行相当微调的控制,因为它们有自己的细节。例如,"ON YOMI" 是目标对象上的字符串列表,因此查询将如下所示:
Where(k => k.OnYomi.Contains(tb_OnYomi.Text))
"Meaning" 想要进行全文搜索,例如 String.Contains 或 LIKE,"Stroke count" 将需要一些解析,因为它必须支持范围,例如,如果您键入 5 -8,查询应如下所示:(x >=5 && x <=8)。 "Other" 需要根据在组合框中选择的值定位不同的 属性。
我在 MSDN 上找到了这个,坦率地说,我无法理解它: https://msdn.microsoft.com/en-us/library/bb882637.aspx
有人可以提供更好的解释或更易于理解的示例吗?谢谢。
表达式树解决方案太过分了。如果您从 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.