Как я могу объединить предложение select в linq с объектами, чтобы проектировать в анонимный тип?
Предположим, что у меня есть эти объекты:Объединить предложения select в linq с объектами с анонимными типами
public class Address
{
public string City { get; set; }
public int ZipCode { get; set; }
//other properties
}
public class Person
{
public string Name { get; set; }
public Address Address { get; set; }
//a LOT of other properties
}
//extend person class with employee specific properties
public class Employee : Person
{
public double Salary { get; set; }
public Person Manager { get; set; }
}
Иногда мне только нужно, чтобы запросить несколько свойств моего Person класса:
Context.Persons.Where(...).Select(p => new
{
p.Name,
PersonCity = p.Address.City,
//other needed properties
});
И я также необходимо запросить те же свойства мой класс сотрудников плюс особые свойства:
Context.Employees.OfType<Employee>().Where(...).Select(e => new
{
e.Salary,
ManagerName = e.Manager.Name,
e.Name,
PersonCity = e.City.Name,
//other needed properties identical as the previous select with Person entity
});
Возможно ли использовать манипуляции с выражением-деревьями (или другое решение) для объединения двух предложений select, чтобы не дублировать все предложения select из моего объекта Person?
Нечто подобное:
var personSelect = p => new {
p.Name,
PersonCity = p.Address.City,
//other needed properties
};
var employeeSelect = personSelect.Combine(e => new {
e.Salary,
ManagerName = e.Manager.Name
});
context.Employees.OfType<Employee>().Where(...).Select(employeeSelect).FirstOrDefault();
// returns an anonymous object
// {
// Name = "Joachim",
// PersonCity = "Lyon",
// <other Person properties>
// Salary = 65432.10,
// ManagerName = "Samuel"
// }
Вы в основном хотите реализацию для выражения 'Expression Combine (выражение > e1, выражение ) где TInput2: TInput1'? –
Shlomo
Ой, подождите, это не сработает. Я вижу, что говорит свичок. Анонимный тип, созданный в lambda в 'employeeSelect', недостаточно исчерпывающий, и функция не может вернуть новый анонимный тип. – Shlomo
Функция должна иметь подпись 'Expression> Combine (выражение > e1, выражение >), где TInput2: TInput1' и 'TOutput3' не существует во время компиляции. –
Shlomo