2013-03-21 3 views
12

В настоящее время в LINQ, следующие компилирует и работает просто отлично:Используя LINQ, можно ли вывести динамический объект из оператора Select? Если да, то как?

var listOfFoo = myData.Select(x => new FooModel{ 
    someProperty = x.prop1, 
    someOtherProperty = x.prop2 
}); 

public class FooModel{ 
    public string someProperty { get; set; }; 
    public string someOtherProperty { get; set; }; 
} 

Однако, последние несколько версий .NET/C# расширили роль динамических объектов, таких как ExpandoObject и мне интересно, если есть способ в основном это сделать:

var listOfFoo = myData.Select(x => new ExpandoObject{ 
    someProperty = x.prop1, 
    someOtherProperty = x.prop2 
}); 

Очевидно, я уже пробовал код выше, без успеха, но кажется, что я что-то отсутствует.

ответ

25

Вы должны быть в состоянии создать новый анонимный объект без какой-либо объявлен:

var listOfFoo = myData.Select(x => new { 
    someProperty = x.prop1, 
    someOtherProperty = x.prop2 
}); 
+0

D'oh! Человек, я чувствую себя глупым. Да, это было так просто. Может принимать ответ через 6 минут. Благодаря! –

+4

@MatthewPatrickCashatt Обратите внимание, что в объекте нет ничего динамичного. Объект, который здесь определен, статически типизирован и даже неизменен. Теперь, если это подходит для ваших нужд, это здорово, но если вы действительно хотите, что вы просили в вопросе, то это не так. – Servy

+0

Спасибо, @Servy. Я ценю ваш ответ. Однако меня смущает в отношении вашего комментария, что подход @ d_r_w по-прежнему позволяет мне добавлять динамические свойства к объекту. Например, 'foreach (динамический элемент в listOfFoo {item.someNewProperty =" bar "}' отлично работает. Что мне не хватает? –

10

Там ничто не мешает вам использовать Select вернуть коллекцию ExpandoObject, вы просто не правильно построения ExpandoObject , Вот один из способов:

var listOfFoo = myData.Select(x => 
    { 
     dynamic expando = new ExpandoObject(); 
     expando.someProperty = x.prop1; 
     expando.someOtherProperty = x.prop2; 
     return (ExpandoObject)expando; 
    }); 
+2

Я не думаю, что это будет работать без преобразования в IEnumerable. –

+0

@MystereMan Преобразование в 'IEnumerable'? – Servy

+0

Преобразование EF IQueryable (я предполагаю, что это не Linq для объектов). Я не думаю, что код ExpandoObject будет конвертируемым в SQL, поэтому он, скорее всего, сгенерирует ошибку EF. Вам нужно будет преобразовать результаты в IEnumerable, чтобы сделать это. –

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

  • Нет связанных вопросов^_^