1

我尝试使用动态 linq 对DataGridFiltering 项目进行运行时数据网格过滤。但我遇到了枚举问题。

例如,我有一个包含这样的枚举属性的类:

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 方法中收到此错误:

无法访问“枚举”类型的方法

4

2 回答 2

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;
}
于 2013-08-25T06:36:54.987 回答
-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();
}
于 2013-11-05T13:49:06.430 回答