2009-12-01 2 views
2

Я использую динамическую библиотеку Linq, которую описывает Скотт Гатри here.Управление динамическим выбором с помощью Dyanmic Linq

Примеры Скотта Гатри замечательные, и я использовал динамические предложения Where довольно немного.

Теперь, однако, я столкнулся с ситуацией, когда мне нужно использовать функцию динамического выбора. Скотт Гатри показывает скриншот этой функции (в последнем скриншоте в статье), но очень умно ее не объясняет.

Проблема в том, что, хотя код компилируется и запускается, я не вижу, как он может работать любым полезным способом. Может быть, с отражением?

Вот пример (помните, что вы должны использовать динамическую библиотеку Linq, описанную Гатри в статье выше, это не обычный Linq System.Linq).

В моем примере здесь у меня есть таблица Users с полями UserId, FirstName и LastName. Но неважно, какая база данных вы используете. Проблема очень проста в воспроизведении. Вот мой пример кода:

Сначала убедитесь, что у вас есть это с помощью заявления на вершине:

using System.Linq.Dynamic; 

Затем вы можете запустить следующий код:

using (DataClasses1DataContext dcdc = new DataClasses1DataContext()) 
     { 
      var x = dcdc.Users.Select("new(UserId, FirstName, LastName)"); 
      foreach (var item in x) 
      {      

       Console.WriteLine(item.ToString()); 
      } 
     } 

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

Поскольку запрос Select является строкой, во время разработки нет вывода типа. Так что я не могу написать:

Console.WriteLine(item.UserId); 

компилятор не имеет ни малейшего представления о том, что элемент анонимного типа имеет элемент с именем UserId. Так что код даже не будет компилироваться (хотя если вы приостановите отладчик во время цикла For..Each, вы увидите, что в окне отладки есть элементы UserId, FirstName и LastName.

Итак ... как это должно работать? Как вы получаете доступ к членам анонимного типа?

ответ

3

Он будет работать нормально для привязки данных (я подозреваю, что это его предполагаемый прецедент), который использует отражение под капотом. также будет работать нормально с dynamic в .NET 4.0:.

foreach (dynamic item in x) { 
    Console.WriteLine(item.UserId); 
} 

кроме этого ... отражение или TypeDescriptor

foreach (object item in x) { 
    Console.WriteLine(item.GetType().GetProperty("UserId").GetValue(item, null)); 
} 
+0

Как я и подозревал ... но спасибо за подтверждение. –

+1

См. Http://stackoverflow.com/questions/1465700/system-linq-dynamic-select-new-into-a-listt-or-any-other-enumerabl/1468357#1468357 о том, как изменить 'System.Linq .Dynamic', чтобы вернуть строго типизированные результаты в .NET 3.5. – Seph

+0

@CleverHuman см. Комментарий Seph –

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