DataGridFilteringプロジェクトでランタイムデータグリッドフィルタリングに動的linqを使用しようとしていますが、列挙型に問題があります。
たとえば、次のようなenumプロパティを含むクラスがあります。
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メソッドでこのエラーが発生します。
タイプ「列挙型」のメソッドにはアクセスできません
問題は、使用している動的linqライブラリがEnum.Equals(otherVal)やEnum.ToString()などのEnumメソッドをサポートしていないことだと思います。 dynamic-linqを使用する必要がある場合、これを回避する1つの方法は次のとおりです。
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;
}