2013-08-25 3 views
1

런타임 데이터 격자 필터링에 DataGridFiltering project으로 동적 리치를 사용하려고하는데 enums에 문제가 있습니다.동적 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(); 
    } 

나는 동적 LINQ의 ParseMemberAccess 방법이 오류 얻을 :

은 FindByType 방법이다 유형에

방법 '열거에게'액세스 할 수 없습니다

답변

0

나는 문제는 사용하는 동적 linq 라이브러리가 Enum.Equals (otherVal), o와 같은 Enum 메소드를 지원하지 않는다고 생각한다. 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에 당신은하지 미리 정의 된 클래스 배열, 해결 방법은이 같은 학생 클래스에 속성을 추가 할 수 있습니다 클래스의 메서드 호출 두지 : 다음 질의를

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 소스에'static readonly Type [] predefinedTypes'을 입력하십시오.이 필드에 유형이 포함되어 있지 않으면 이유가있는 ParseError를 발생시킵니다. 'MethodAreInaccessible' – Grundy

+0

@Grundy 내가 시도 할 때 구문 분석 오류가 발생했을 것임에 틀림 없습니다. Student 클래스의 속성에 확장 메서드를 직접 사용하십시오.내가 실험 한 것으로부터, Student 클래스에서 정의 된 프로퍼티/함수의 확장 메소드를 사용하면 파싱 오류도 발생합니다. – liang