代码之家  ›  专栏  ›  技术社区  ›  David

iqueryable.where()的Linq动态参数

  •  1
  • David  · 技术社区  · 16 年前

    我会在这篇文章的开头说,作为一名C开发人员,我是第8天。

    对于我正在处理的项目中的许多域模型,我需要能够根据用户在审阅/搜索表单中提交的内容筛选表中的所有记录。

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

    表格提交给FOOController/审查。

    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);
    

    但这显然不会奏效,原因很多…不过,我想实现的目标仍然存在。我真的想通过使用某种动态助手/实用程序来简化代码并加速过滤过程。

    我尝试的另一个想法是使用反射和那个孩子的作品进行直接比较,但是接下来如何检查像CreatedTime属性这样的东西,我希望所有记录都更大,然后“r=>CreatedDateTime>CreatedFrom”。

    如果这些都不合理,请发表评论,我会努力解决任何问题。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Marc Gravell    16 年前

    你在问什么 可以 是自动化的,但它是相当多的工作,需要的知识 Expression 应用程序编程接口。这是一个相当高级的话题。

    我可能会保持代码“原样”…干是好的,但“不要破坏工作代码”是另一句值得知道的格言…

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