我尝试使用动态linq进行运行时数据网格过滤DataGridFiltering project。但我的枚举有问题。
例如,我有一个包含这样的枚举属性的类:public class Student
{
public Student(int id,string name,StudentType type)
{
Id = id;
Name = name;
Type = type;
}
public int Id { get; set; }
public string Name { get; set; }
public StudentType Type { get; set; }
}
和StudentType枚举是:
public enum StudentType : byte
{
Normal=0,
Good
};
我创建了一个控制器类,用于处理学生列表。
在我的控制器中,我有一种按类型查找学生的方法。
这是FindByType方法:
public IList<Student> FindByType(string type)
{
return _students.AsQueryable().Where("Type.ToString().StartWith(@0)",type).ToList();
}
当我调用FindByType方法时,我在动态linq的ParseMemberAccess方法中得到此错误:
无法访问“枚举”类型的方法
答案 0 :(得分:0)
我认为问题在于您使用的动态linq库不支持任何Enum方法,例如Enum.Equals(otherVal)或Enum.ToString()。如果你必须使用dynamic-linq,解决这个问题的一种方法是:
public IList<Student> FindByType(StudentType type)
{
return _students.AsQueryable().Where("Type = (@0)", type).ToList();
}
但是,如果你能够使用标准linq,并且你真的想因某种原因传入一个字符串,那么这样的东西会更清晰:
public IList<Student> FindByType(string type)
{
return _students.Where(s => s.Type.ToString().StartsWith(type)).ToList();
}
修改: 如果你需要使用StartsWith进行搜索的能力,并且你不允许使用上面的标准linq查询,那么这里会有更多代码提供相同的结果
public IList<Student> FindByType(string type)
{
//Replace e.StartsWith with whatever method you wish to filter by
var studentTypeNames =typeof(StudentType).GetEnumNames().Where(e => e.StartsWith(type)).ToList();
var students = new List<Student>();
foreach (var studentTypeName in studentTypeNames)
{
StudentType studentType;
Enum.TryParse(studentTypeName, true, out studentType);
students.AddRange(_students.AsQueryable().Where("Type = (@0)", studentType).ToList());
}
return students;
}
答案 1 :(得分:-1)
在Dynamic Linq中,您无法从不在预定义类数组中的类调用方法,为了解决方法,您可以在Student类中添加属性,如下所示:
public string StudentTypeString {get {return Type.ToString(); } }
并使用下一个查询
public IList<Student> FindByType(string type)
{
return _students.AsQueryable().Where("StudentTypeString.StartWith(@0)",type).ToList();
}