动态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枚举筛选错误

我认为问题是您使用的动态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();
}