Обработка динамического выбора с помощью Dyanmic Linq
Я использую Dynamic Linq Library, которую Скотт Гатри описывает здесь.
Примеры Скотта Гатри великолепны, и я довольно часто использовал динамические операторы Where.
Однако теперь я столкнулся с ситуацией, когда мне нужно использовать функциональность динамического выбора. Скотт Гатри показывает скриншот этой функции (в самом последнем скриншоте в статье), но очень умно никогда не объясняет это.
Проблема в том, что, хотя код компилируется и запускается, я не вижу, как он может работать каким-либо полезным способом. Возможно, с отражением?
Вот пример (помните, вы должны использовать динамическую библиотеку Linq, которую Гатри описывает в статье выше, это не обычный Linq System.Linq).
В моем примере здесь у меня есть таблица Users с полями UserId, FirstName и LastName. Но это действительно не имеет значения, какую базу данных вы используете. Вопрос очень прост для воспроизведения. Вот мой пример кода:
Сначала убедитесь, что вы используете это с помощью оператора top:
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.
Итак... как это должно работать? Как вы получаете доступ к членам анонимного типа?
1 ответ
Он будет хорошо работать для привязки данных (я подозреваю, что это его предполагаемый вариант использования), который использует отражение под капотом. Это также будет хорошо работать с 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));
}