Обработка динамического выбора с помощью 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));
}
Другие вопросы по тегам