2010-09-21 2 views
2

У меня есть несколько C# бизнес-класса выглядит следующим образом:дизайна класса для фильтра выражений

public class Employee 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string DepartmentCode { get; set; } 
    public string HireDate { get; set; } 
    public DateTime DateOfBirth { get; set; } 
    public DateTime Gender { get; set; } 
} 

public class EmployeeManagement 
{ 
    public List<Employee> GetEmployees(FilterExpression criteria) 
    { 
     throw new System.NotImplementedException(); 
    } 
} 

Цель состоит в том, чтобы получить список сотрудников, передавая различные условия фильтра, например, всех сотрудников, принадлежащих к определенному отделу, или нанятых после определенной даты или всех женщин-сотрудников или комбинации критериев (включая условия И или ИЛИ). Я не хочу реализовывать многие перегруженные методы для каждого из критериев фильтра, поскольку конечные пользователи определяют критерии фильтра, и я не могу принять все возможные случаи.

Не могли бы вы помочь в разработке класса «FilterExpression», который я могу передать методу GetEmployees? Любое другое предложение альтернативного подхода будет приветствоваться.

Спасибо.

Подробнее: Данные сотрудника хранятся в таблице БД. Я не хочу привлекать всех сотрудников в List<Employee>, а затем фильтровать данные. Моя цель состоит в том, чтобы генерировать предложение «where where» SQL из выражения фильтра, так что из самой базы данных я получаю отфильтрованный набор данных Employee. Я борюсь с классом класса FilterExpression, как указано выше.

+1

Как вы собираетесь интерпретировать FilterExpression? Вы собираетесь преобразовать его в sql? Или вы применяете фильтр к списку объектов? –

+1

Вы собираетесь использовать такой запрос, как синтаксис, или представляете пользователям список вариантов, на которые они могут выбрать? – devnull

+0

В пользовательском интерфейсе я намереваюсь представить список параметров фильтра, которые они могут выбрать для нескольких вариантов с объединениями «И» или «Или». –

ответ

2

Вы должны сообщить нам, какое выражение/фильтр вы хотите передать методу. В противном случае я дам читов ответ:

public List<Employee> GetEmployees(Expression<Func<Employee,bool>> predicate) 
    { 
     return AllEmployees.Where(predicate.Compile()).ToList(); 
    } 

вы можете использовать:

var bob = GetEmployees(emp=>emp.Name.Equals("Bob")).FirstOrDefault; 
var ITStaff = GetEmployees(emp=>emp.DepartmentCode.Equals("IT")); 
+0

Это не должно быть выражением, просто func. –

+0

@Rohan West: Becase OP говорит, что хочет выражения. –

0

Почему бы не использовать вместо этого Expression<Func<Employee,bool>>? Хотя это обычно связано с LINQ, это не обязательно. Вы можете передать лямбду и изучить дерево выражений во время выполнения таким образом.

var employees = GetEmployees(x => x.HireDate > DateTime.Today.AddDays(-7)) 
Смежные вопросы