Как работать с объектами неизвестного типа, возвращенными из DataContext.ExecuteQuery - PullRequest
4 голосов
/ 17 февраля 2011

Итак, с появлением динамического ключевого слова в C # 4.0 я надеюсь, что смогу найти лучшее решение проблемы работы с типами, возвращаемыми DataContext.ExecuteQuery, когда выбраны произвольные столбцы.

В прошлом я либо создавал новый тип для хранения результата такого запроса, либо использовал метод, описанный в этом сообщении SO . Итак, теперь, когда я могу работать над новым проектом, работающим под .NET 4.0, я решил использовать динамический тип, чтобы выполнить то же самое менее болезненным образом.

Итак, я дал этому выстрел:

var result = _db.ExecuteQuery<dynamic>( "SELECT CustomerID,City FROM Customers", new object[0] );
foreach( var d in result )
{
    MessageBox.Show( String.Format( "{0}, {1}", d.CustomerID, d.City ) );        
}

Исключение выдается во время выполнения, поскольку свойство CustomerID не существует для динамического объекта. Итак, поскольку мой опыт использования динамического ключевого слова к этому моменту равен нулю (статья или сообщение в блоге или два, нет реального опыта), я надеялся, что кто-то здесь может дать мне знать, возможно ли то, что я пытаюсь сделать здесь. Я, вероятно, переоцениваю количество «магии» за ExecuteQuery, но я подумал, что это может сработать из-за сопоставления свойств, сделанного за кулисами. Любая помощь очень ценится.

Ответы [ 2 ]

6 голосов
/ 13 мая 2011

Совсем недавно мы написали dapper , что прекрасно подходит к исходному вопросу:

var result = connection.Query( "SELECT CustomerID,City FROM Customers");
foreach( var d in result )
{
    MessageBox.Show( String.Format( "{0}, {1}", d.CustomerID, d.City ) );        
}

Он допускает параметры и т. Д., И есть (предпочтительный) типизированный API через Query<T> - но API dynamic тоже отлично работает.

1 голос
/ 17 февраля 2011

Сопоставление выполняется путем проверки T и использования отражения - и dynamic в действительности действительно - просто причудливое слово для object в этом контексте. На данный момент вам, возможно, придется просто создать тип, соответствующий ожидаемому макету.

Вы могли бы попробовать , передав Tuple<int,string>, но я не пробовал этого, и я не уверен, что это удастся сопоставить ctor arg 0 с col 0 и т. Д.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...