Методы IQueryable не разрешаются для динамической переменной запроса - PullRequest
4 голосов
/ 04 марта 2011

Я пытаюсь понять, как использовать динамические переменные для моих методов, использующих запросы LINQ. Например, это прекрасно работает:

using (DBDataContext db = new DBDataContext()) 
{
    var query = from c in db.Users
                select
                new
                {
                    c.Firstname,
                    c.Lastname,
                    c.Age
                };

    gridUsers.VirtualItemCount = query.Count();
    gridUsers.DataSource = query.ToList();
}

Но это не работает:

using (DBDataContext db = new DBDataContext()) 
{
    dynamic query = from c in db.Users
                select
                new
                {
                    c.Firstname,
                    c.Lastname,
                    c.Age
                };

    gridUsers.VirtualItemCount = query.Count();
    gridUsers.DataSource = query.ToList();
}

Ошибка: «объект» не содержит определения «счетчик». Как мне заставить его работать с динамическим ключевым словом?

1 Ответ

10 голосов
/ 04 марта 2011

Вы должны будете использовать:

gridUsers.VirtualItemCount = Queryable.Count(query);
gridUsers.DataSource = Enumerable.ToList(query);

Динамическая типизация не "делает" методы расширения.(Я не полностью уверен, почему. Компилятор хранит изрядное количество информации о сайте вызова - ему, в принципе, придется хранить все директивы using, связанные с сайтом вызова.также замедляет динамическое связывание, что может быть проблемой, которую они пытаются избежать. Может быть, это была слишком большая работа для слишком маленькой выгоды.)

РЕДАКТИРОВАТЬ: Просто из интереса, почему вы пытаетесь использовать динамическую типизацию для вашей последовательности в первую очередь?Я подозреваю, что все подобные вещи станут хитрее ... LINQ довольно сильно зависит от различных битов вывода типов.

Обратите внимание, что наличие IQueryable<dynamic> или IEnumerable<dynamic> хорошо, ибудет работать лучше.

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