【问题标题】:How do I create a lambda expression with unknown fields?如何创建包含未知字段的 lambda 表达式?
【发布时间】:2015-01-19 23:30:03
【问题描述】:

我想动态构建 lambda 表达式,这样我就可以构建一个包含未知数量字段的查询...我该如何完成?

我正在循环一个对象,该对象包含添加到每个字段的 Where 子句中的所有字段和值...

searcher = searcher.Where(f => f.fieldName.Contains(fieldValue));

即伪代码:

foreach(var field in fields){
    searcher = searcher.Where(f => field.name.Contains(field.value));
}

如果我生活在石器时代,我会像这样对其进行伪编码:

var first = true;
string query = " SELECT * FROM TABLE WHERE ";
foreach(var field in fields){
    if(first){
        query += field.name + " LIKE '%" + field.value + "%' ";
    }else{
        query += " AND " + field.name + " LIKE '%" + field.value + "%' ";
    }

    first = false;
}

请告诉我,石器时代并不比当前的技术更强大! ;-)

【问题讨论】:

  • 你需要构建一个表达式树。这不是 EF 的用途;这不是特别容易。
  • 石器时代容易被sql注入;)
  • 您需要引入一个字段的概念,该字段将具有一个 getter 和一个 setter 函数。然后为类的每个属性创建一个字段。然后将所有字段放入列表中。使用这样的字段列表抽象对象允许您在不知道对象结构的情况下运行查询、复制、比较等操作。所有关于它的知识都将被领域抽象出来。
  • 感谢您的 cmets。我认为 EF 遗漏了一个非常重要的功能 ;-)。

标签: c# .net entity-framework dynamic lambda


【解决方案1】:

我希望这会有所帮助。

searcher = fields.Aggregate(searcher, (current, field) => current.Where(f => f.Name.Contains(f.Value)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多