2013-08-25 2 views
1

Я пытаюсь использовать динамический linq для фильтрации datagrid времени исполнения с 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 метод я получаю эту ошибку в методе ParseMemberAccess динамического LINQ:

методы по типу 'Enum' не доступны

ответ

0

Я думаю, проблема в том, что динамическая библиотека 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(); 
} 

Edit: Если вам нужна возможность поиска с помощью StartsWith и вы не можете использовать стандартный запрос Linq выше, здесь что-то, что даст тот же результат с ALOT больше код

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 instate Type.ToString(). пользователь не знает, что пользователь перечисления видит поле типа az, поэтому его необходимо отфильтровать, нажав Start With, End With или Contains. –

+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 я имею в виду 'static readonly Type [] predefinedTypes' в источнике DinamicLinq, если это поле не содержит ваш тип, то будет вызывать ParseError с причиной' MethodAreInaccessible' – Grundy

+0

@GrundyЭто должно быть причиной ошибки синтаксического анализа, когда я пытался используйте метод расширения для свойства класса Student напрямую.Из того, что я экспериментировал, использование методов расширения в свойстве/функции, даже определенном в классе Student, также потерпит неудачу при некоторой ошибке синтаксического анализа. – liang

Смежные вопросы