2010-08-25 4 views
0

У меня есть коллекция IEnumerable. В запросе LINQ, желательно, я хотел бы выбрать только свойства в этой коллекции из типа T в анонимный тип, где T является бизнес-объектом POCO.Динамический выбор списка свойств от объекта

Пример:

Мои IEnumerable содержит свойства "Имя", "Возраст".

Мои РоКо:

public class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public string Address { get; set; } 
    public string Phone { get; set; } 
} 

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

IEnumerable<Person> peeps = GetPeople(); 
var names = from p in peeps 
      select new {Name = p.Name, Age = p.Age}; 

Если я использую Entity Framework, я мог бы использовать Entity SQL с динамически сконструированным пунктом строки where, но, хотя и не строго жестким код, я до сих пор использую строковые имена свойств.

Добавлено: Могу ли я не возможно динамически построить выражение для метода проекции .Select, который определяет, какие свойства включены в объекте результата?

ответ

0

Вы не можете этого сделать. Компилятор должен знать статический тип элементов в перечислении, даже если это анонимный тип (var ключевого слова обозначает неявного печатать, не динамической типизации)

Почему вы должны сделать это? Если вы объясните, каково ваше требование, мы можем предложить другой способ сделать это.

+0

Я экспортирую коллекцию объектов JobCard. Свойства каждого объекта, который должен быть включен в CSV-представление объекта, зависят от роли пользователя. На данный момент я просто просматриваю список свойств, включенных для роли и использую отражение, чтобы получить их значения из каждого объекта JobCard. В качестве примера я использовал только «var». Могу ли я не использовать «динамический»? Я ничего не знаю об этом. – ProfK

+0

динамика не помогла бы в этом случае. Я думаю, что отражение - ваш единственный вариант ... –

+0

см. Мое редактирование. Я знаю, что я сказал «в запросе LINQ», но для интереса ограничение на набор динамических свойств зависит от платформы и может быть достигнуто с помощью Entity Framework. – ProfK

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