我有很多看起来像这样的丑陋代码:
if (!string.IsNullOrEmpty(ddlFileName.SelectedItem.Text))
results = results.Where(x => x.FileName.Contains(ddlFileName.SelectedValue));
if (chkFileName.Checked)
results = results.Where(x => x.FileName == null);
if (!string.IsNullOrEmpty(ddlIPAddress.SelectedItem.Text))
results = results.Where(x => x.IpAddress.Contains(ddlIPAddress.SelectedValue));
if (chkIPAddress.Checked)
results = results.Where(x => x.IpAddress == null);
...etc.
results
是一个IQueryable<MyObject>
。
这个想法是,对于这些无数下拉列表和复选框中的每一个,如果下拉列表中选择了某些内容,则用户希望匹配该项目。如果选中该复选框,则用户特别想要该字段为空或空字符串的那些记录。(UI 不允许同时选择两者。)这一切都添加到 LINQ 表达式中,在我们添加了所有条件之后,该表达式将在最后执行。
似乎应该有某种方法可以抽出一两个,以便我可以将重复的部分放入一个方法中,然后传递更改的内容。Expression<Func<MyObject, bool>>
我在其他地方做过这个,但是这组代码让我受阻。(另外,我想避免“动态 LINQ”,因为如果可能的话,我想保持类型安全。)有什么想法吗?