我在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中获取的列名。
有没有办法可以避免写切换案例?
答案 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());