【问题标题】:Convert string value to entity in linq where query将字符串值转换为 linq where 查询中的实体
【发布时间】:2014-01-03 13:11:05
【问题描述】:

我在 MVC 4 中使用 jqgrid。我编写了一个在 linq 中获取列表的方法。 在我的函数中,我使用搜索条件(即运算符 AND/OR)获取 jqgrid 的所有值 ,操作等于,不等于等。这里我还得到了列名,如名称、城市、州等。

我的问题是我不能直接在 linq 查询中传递列名,即我必须使用列名作为 x => x.Name

switch (rule.field)
{
    case "Name":
    query = query.Where(x => x.Name.StartsWith(rule.data, StringComparison.OrdinalIgnoreCase));
    break;

    case "Course":
    query = query.Where(x => x.Course.StartsWith(rule.data, StringComparison.OrdinalIgnoreCase));
    break;
}

在 rule.field 中,我得到列名,即名称、城市、州等。我想传递我在 LINQ 查询中的 rule.filed 中得到的列名,而不是 x =>x.Name

有什么办法可以避免编写 switch 案例吗?

【问题讨论】:

    标签: linq where


    【解决方案1】:

    您可以使用 System.Linq.Dynamic,它可以与 string.Format 一起安装为 Nuget package。然后语法看起来像..

     var newquery = query.AsQueryable()
                .Where(
                    string.Format("{0}.ToUpper().StartsWith(@0)", rule.field)
                        ,rule.data.ToUpper());
    

    【讨论】:

      【解决方案2】:

      你总是可以使用反射:

      query = query.ToList().Where(p => {
          var field = p.GetType().GetProperty(rule.field);
          var value = (String) field.GetValue(p);
          return value.StartsWith(rule.data, StringComparison.OrdinalIgnoreCase);
      });
      

      警告:反射。仅将其用于短列表。由于您正在处理 UI 渲染,我假设这不会是一个问题。

      编辑: 我的示例假设所有属性确实是属性(而不是字段),并且所有属性都是字符串。您可能需要根据具体情况更改代码。

      【讨论】:

      • 我收到类似“无法将带有语句体的 lambda 表达式转换为表达式树”的错误
      • 答案修改为ToList(),以确保查询对象是可查询的。如果这也不起作用,请参阅stackoverflow.com/questions/5179341/… 了解相关问题。 (我不知道query 是什么类型的对象。我以为它是某种IQueryable
      猜你喜欢
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      相关资源
      最近更新 更多