我已经得到了很多丑陋的代码看起来像这样:你会如何重构这个LINQ代码?
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”,因为如果可能,我想保持类型安全。)任何想法?
请记住,这是LINQ to SQL(我没有在问题中说过,但它是其中一个标签)。我想过滤发生在数据库端,而不是客户端。 – 2008-09-30 01:42:39