【问题标题】:Linq dynamic arguments for IQueryable.Where()IQueryable.Where() 的 Linq 动态参数
【发布时间】:2009-06-03 19:48:33
【问题描述】:

我会先说我已经是 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 => CreatedDatetime > CreatedFrom”。

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

【问题讨论】:

    标签: c# linq dry


    【解决方案1】:

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

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

    或者,您可能想查看Dynamic LINQ Library - 这可能会帮助您实现自动化。但说实话,现有的代码并没有那么丑……

    【讨论】:

    • 这就是我自己找到动态Linq库时得出的结论。它很酷,但我现在负担不起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2012-01-04
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多