动态linq枚举筛选错误
本文关键字:错误 筛选 枚举 linq 动态 | 更新日期: 2023-09-27 18:28:51
我试图在DataGridFiltering项目中使用动态linq进行运行时数据网格过滤。但我的枚举有问题。
例如,我有一个类,它包含这样的枚举属性:
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方法中得到了这个错误
类型"Enum"上的方法不可访问
我认为问题是您使用的动态linq库不支持任何Enum方法,如Enum.Equals(otherVal)或Enum.ToString()。如果必须使用动态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;
}
在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();
}