将字符串值转换为linq中查询的实体

时间:2014-01-03 13:11:06

标签: linq where

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

我的问题是我无法直接在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查询而不是x =>x.Name中传递我在rule.filed中获取的列名。

有没有办法可以避免写切换案例?

2 个答案:

答案 0 :(得分:0)

你总是可以使用反射:

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呈现,我假设这不会成为问题。

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

答案 1 :(得分:0)

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

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