Linq动态参数为IQueryable.Where()

时间:2009-06-03 19:48:33

标签: c# linq dry

我将在前言中说我已经成为C#开发人员的第8天了。

对于我正在处理的项目中的许多DomainModel,我需要能够根据用户在评论/搜索表单中提交的内容过滤表格中的所有记录。

目前2美分的短途旅行是:

表格提交给FooController / review。

Review然后将Params ['filter']中的所有键/值对抓取到字典中,并将其传递给助手类调用FooFinder.ByProperties,它看起来非常类似于:

public IQueryable<WorkPlan> ByProperties( IDictionary<string, string> properties)
    {            

        var result = ForSite(Convert.ToInt64(properties.DefaultVal("SiteId", "0")));

        v);

        if(properties.ContainsKeyAndIsNotNullOrEmpty("WorkPlan.Key"))
        {
            var tempVal = Convert.ToInt64(properties["WorkPlan.Key"]);
            result = result.Where(r => r.Id == tempVal);
        }
        // Multiple of these conditional checks follows
       return result;

}

我想尽可能减少重复代码并尝试类似

result = ByProperty(properties, "WorkPlan.key", typeof (Int64), r, v => r.id == v);

但那显然不会因为很多原因而起作用......我仍然想要实现的目标就在那里。我真的想通过使用某种动态帮助器/实用程序来简化代码并加快过滤过程。

我试过的其他想法是使用Reflection和那个直接比较的作品,但是如何检查像CreatedDatime属性这样的东西,我想要所有记录大于“r =&gt; CreatedDatetime&gt; CreatedFrom”。

如果这些都没有意义,请发表评论,我会尽力解决任何问题。

1 个答案:

答案 0 :(得分:2)

您要求可以自动化,但这需要相当多的工作,并且需要了解Expression API。这是一个非常高级的话题。

我可能会保持代码“按原样”......干得很好,但“不要破坏工作代码”是另一个值得了解的格言......

或者,您可能希望查看Dynamic LINQ Library - 这可能会帮助您实现自动化。但说实话,现有的代码并不那么难看......