动态linq枚举过滤错误

时间:2013-08-25 06:04:32

标签: c# wpf datagrid dynamic-linq

我尝试使用动态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方法中得到此错误:

  

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

2 个答案:

答案 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();
}