Динамически .Skip () и .Take () IQueryable <AnonymousType> - PullRequest
1 голос
/ 02 декабря 2011

У меня есть элемент управления сеткой, у которого свойство DataSource равно Object. Теперь я хочу привести свое DataSource к IQueryable<T>, чтобы взять и пропустить. Мне нравится Код

var pagedData = ((IQueryable<T>) DataSource).Skip(20).Take(10);

Но я не знаю, как я могу разыграть Object на IQueryable<T>? также в большинстве случаев тип данных IQueryable<AnonymousType>.

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

Почти наверняка найдутся лучшие способы справиться с этим, но чтобы ответить на ваш вопрос, как вы спросили, вы можете использовать dynamic:

private static IQueryable<T> GetInteriorElements<T>
                (IQueryable<T> source, int skip, int take)
{
    return source.Skip(skip).Take(take);
}

И назовите это как:

object DataSource = ...

// The real question is: what are you now going to do with this?
var pagedData = GetInteriorElements((dynamic)DataSource, 10, 20);

Если вы используете .NET 3.5, вам, к сожалению, придется использовать отражение.

1 голос
/ 02 декабря 2011

Пришло время правильно определить класс.Анонимные типы хороши, когда они полностью автономны в методе, который их создал.Когда вы демонстрируете необходимость использовать их в другом месте кода, документируйте тип с помощью определения класса, а затем вы можете использовать этот класс везде, где вам это нужно, в том числе в приведении.Как только вы создали определение класса, просто обращайтесь к классу по имени везде, где вам это нужно.

Запрос:

...
select new ClassName // name the class
{
    ...
}

Тип возвращаемого метода

public IQueryable<ClassName> GetData()

И приведение

var data = (IQueryable<ClassName>)theDataSource;
0 голосов
/ 02 декабря 2011

Почему бы просто не использовать PagedDataSource в качестве источника для вашей Grid и позволить, чтобы это сработало за вас?

Пейджинг с использованием класса PagedDataSource - CodeProject

...