2013-08-25 97 views
1

我试图使用动态LINQ运行时数据网格过滤与DataGridFiltering project但我有一个枚举的问题。动态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方法:

上式方法 '枚举' 而无法访问

回答

0

我认为问题是您正在使用的动态linq库不支持任何枚举方法,例如Enum.Equals(otherVal),o r 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; 
} 
+0

感谢您的回答。我使用最新版本的动态LINQ。因为我使用datagridfilter我不能写Type.ToString()的Type instate。用户不知道这是一个枚举用户请参阅类型字段az字符串,因此需要通过开始,结束或包含条件来过滤它。 –

+0

我在代码中添加了一个代码,可以指定一个字符串,并且您将通过StartsWith过滤返回您希望的列表。然而,你应该能够得到你想要的中间一段代码,因为那个代码也接受一个字符串方法并使用StartsWith过滤。有什么理由不能使用标准的Linq? –

-1

在动态LINQ的不要去碰从调用类的方法,并非预先定义的类阵列,用于解决方法您可以在Student类像这样添加属性:

public string StudentTypeString {get {return Type.ToString(); } } 

,并使用一个查询

public IList<Student> FindByType(string type) 
{ 
    return _students.AsQueryable().Where("StudentTypeString.StartWith(@0)",type).ToList(); 
} 
+0

你是什么意思预定义在类数组中? – liang

+0

@liang我的意思是在DinamicLinq源代码中静态只读类型[] predefinedTypes',如果这个字段不包含你的类型,那么将会引发ParseError,原因是'MethodsAreInaccessible' – Grundy

+0

@Grundy当我尝试去解析错误时,肯定是原因直接在Student类的属性上使用扩展方法。根据我的实验,甚至在Student类中定义的属性/函数中使用扩展方法也会导致一些解析错误。 – liang