Я использую динамическую библиотеку 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.
Итак ... как это должно работать? Как вы получаете доступ к членам анонимного типа?
Как я и подозревал ... но спасибо за подтверждение. –
См. 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
@CleverHuman см. Комментарий Seph –