Выражения Linq и агрегатные классы - PullRequest
0 голосов
/ 13 сентября 2010

Как мне создать выражения Linq для агрегатных классов?Позвольте мне объяснить на примере того, что я пытаюсь сделать.Скажем, я хочу найти всех сотрудников с зарплатой, не равной 50000, и вот структура классов.

    Employee e1 = new Employee { Name = "Jane", PDetail = new PayDetail { Salary = 100000 } };
    Employee e2 = new Employee { Name = "Joe", PDetail = new PayDetail { Salary = 50000 } };

    emps.Add(e1);
    emps.Add(e2);

//I started doing it this way and this code DOES NOT compile

var parameter = Expression.Parameter(typeof(PayDetail));

var where = Expression.NotEqual(Expression.Property(parameter, "Salary"), Expression.Constant(50000));

var pred = Expression.Lambda(where, parameter);

var query = Enumerable.Where(emps, (Func<PayDetail, Boolean>)pred.Compile());

РЕДАКТИРОВАТЬ: Любая помощь с нулевой проблемой (как отмечено в комментариях)?Спасибо

1 Ответ

0 голосов
/ 13 сентября 2010

Вы не передаете правильные аргументы методу Enumerable.Where. Вы передаете список Employee и метод, который работает на PayDetail. Вы можете использовать

var query = Enumerable
    .Where(emps.Select(e => e.PDetail), (Func<PayDetail, Boolean>)pred.Compile());

или более короткая версия

var query = emps.Select(e => e.PDetail)
    .Where((Func<PayDetail, Boolean>)pred.Compile());

Что даст вам правильные PayDetails, но не правильные Employee s '. Я считаю, что вы действительно ищете:

var parameter = Expression.Parameter(typeof(Employee));

var where = Expression.NotEqual(Expression.Property(
    Expression.Property(parameter, "PDetail"), "Salary"), 
        Expression.Constant(50000));

var pred = Expression.Lambda(where, parameter);

var query = emps.Where((Func<Employee, Boolean>)pred.Compile());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...