Я использую динамическую библиотеку Linq, которую Скотт Гатри описывает здесь .
Примеры Скотта Гатри великолепны, и я довольно часто использовал динамические выражения 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());
}
}
Как видите, это компилируется и работает просто отлично. Вы получаете все свои записи обратно из базы данных. Однако я не могу найти на самом деле доступ к членам нового анонимного типа.
Поскольку запрос на выборку является строкой, во время разработки нет вывода типа. Поэтому я не могу написать:
Console.WriteLine(item.UserId);
Компилятор не знает, что элемент анонимного типа имеет член с именем UserId. Так что этот код даже не скомпилируется (даже если вы остановите отладчик во время цикла For..Each, вы увидите, что окно отладки видит, что есть члены UserId, FirstName и LastName.
Так ... как это должно работать? Как получить доступ к членам анонимного типа?