2015-09-25 10 views
1

Я чувствую, что мне не хватает чего-то простого, но я не нашел документацию, отвечающую на мой вопрос.Как повторно использовать выражение для одного объекта в другом выражении

Я недавно разложил некоторые из линейных проекций на многоразовые выражения. Он отлично работает при работе в коллекции, но я не могу понять, как применить выражение к одному объекту в другом выражении. Ниже приведен пример того, что я пытаюсь сделать:

public class Person 
{ 
    public string ID { get; set; } 
    public string Name { get; set; } 
} 

public class PersonDto 
{ 
    public string ID { get; set; } 
    public string Name { get; set; } 
} 

public class Department 
{ 
    Person Manager { get; set; } 
    List<Person> Employees { get; set; } 
} 

public class DepartmentDto 
{ 
    PersonDto Manager { get; set; } 
    List<PersonDto> Employees { get; set; } 
} 

public Expression<Func<Person, PersonDto>> CreatePersonDto = p => new PersonDto 
{ 
    ID = p.ID, 
    Name = p.Name 
}; 

public Expression<Func<Department, DepartmentDto>> CreateDepartmentDto = d => new DepartmentDto 
{ 
    Manager = d.Manager // How do I transform this `Person` using `CreatePersonDto` 
    Employees = d.Employees.Select(CreatePersonDto) //Does not work either 
}; 

EDIT: Чтобы было ясно, я использую Linq-на-Сущности, которые нужно использовать это выражение для генерации SQL заявление. В результате я не могу сделать Func, поскольку я мог бы использовать Linq-to-Objects.

+0

'CreatePersonDto' превращает' Person' в 'PersonDto', но тип' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ign '' PersonDto' в переменную 'Person' (это то, что вы хотите сделать в' Manager = // Как мне .... ') –

+0

В моем примере произошла ошибка. Я изменил его. DepartmentDto должен состоять из PersonDto и списка . Спасибо за указание @codroipo –

+1

Имеет ли вторая строка 'Employees = d.Employees.Select (CreatePersonDto)', дает вам какие-либо ошибки? Это для меня. IIRC невозможно легко использовать выражения внутри выражений. Вы должны вручную создать выражение, используя статические методы класса 'Expression'. – Mayoor

ответ

2

Вы можете использовать LINQKit расширить выражения, которые вы имеете в других выражениях:

private static Expression<Func<Department, DepartmentDto>> CreateDepartmentDtoUnexpanded = d => new DepartmentDto 
{ 
    Manager = CreatePersonDto.Invoke(d.Manager), 
    Employees = d.Employees.Select(employee => CreatePersonDto.Invoke(employee)) 
     .ToList(), 
}; 
public static Expression<Func<Department, DepartmentDto>> CreateDepartmentDto = CreateDepartmentDtoUnexpanded.Expand(); 
+0

Эта ссылка является именно тем, что я ищу. Я изо всех сил пытался сформулировать проблему, и эта страница объясняет это очень четко. Он также предлагает решение! –

-1

Вы можете:

public static Expression<Func<Department, DepartmentDto>> CreateDepartmentDto = d => 
    new DepartmentDto 
     { 
      Manager = CreatePersonDto.Compile()(d.Manager), 
      Employees = d.Employees.Select(CreatePersonDto.Compile()).ToList() // Or declare Employees as IEnumerable and avoid ToList conversion 
     }; 

Очевидно, что вместо вызова два раза Compile метода вы можете хранить скомпилированный Func

+1

это не сработает для OP (вы можете увидеть его комментарий выше). Однако он даже не комментировал что-либо, чтобы жаловаться на это (пока я не спросил его в своем комментарии). Это указывает на *** неуважительное отношение ***, и мне это совсем не нравится. Поэтому я просто удалил свой ответ (что, безусловно, работает). Вы также должны удалить этот ответ, никоим образом не отредактировать, а также сохранить его здесь. Он мог подумать, что все здесь были невежественными или просто болтливыми. Мои знания о LinqToEntity достаточно хороши, поэтому мне не нужно было спрашивать его, почему это не сработает, это была просто проблема моих глаз. – Hopeless

+0

@Hopeless Я согласен с вами в том, что вы удаляете неуважительное отношение к OP, но я думаю, что если кто-то придет на эту страницу, потому что у него есть проблема, изначально заявленная OP, он может найти ответ, если я не удалю сообщение. –

+0

Если бы ваш ответ сработал, он бы принял его. Но поскольку он не работает, его сохранение не приносит пользы другим.Кроме того, правильный ответ довольно прост, кто-то может попытаться копать немного, чтобы найти правильный ответ без особых усилий (может быть, с помощью какой-то команды). – Hopeless