IQueryable (не универсальный): отсутствует Count и Skip? это работает с IQueryable <T> - PullRequest
6 голосов
/ 26 ноября 2010

у меня есть метод расширения, который мне действительно помог дать человек ... он выполняет заказ на IQueryable ... но я хотел, чтобы он сделал обычный IQueryable (не универсальный)

Вот код, граф, пропустить и я думаю, что Take отсутствуют.

   public static IQueryable GetPage(this IQueryable query,
         int page, int pageSize, out int count)
    {
        int skip = (int)((page - 1) * pageSize);

        count = query.Count(); //COUNT DOESN'T EXIST
        return query.Skip(skip).Take((int)pageSize); // NEITHER SKIP
    }

Вот и все работает без ошибок.

    public static IQueryable<T> GetPage<T>(this IQueryable<T> query,
       int page, int pageSize, out int count)
    {
        int skip = (int)((page - 1) * pageSize);

        count = query.Count();
        return query.Skip(skip).Take((int)pageSize);
    }

Есть идеи, как мне это обойти? Я не хочу менять типы возвращаемых данных, так как он отлично работает, и у меня есть другой метод расширения, называемый ToDataTable, и он также работает с неуниверсальным IQueryable ..

Есть ли обходной путь?

Заранее спасибо

EDIT

Я называю это так на существующем IQueryable

 IQueryable<Client> gen = null;
 IQueryable nongen = null;

 var test = gen.GetPage();  //COMPILES!

 var test 1 = non.GetPage(); // Doesn't compile because GETPAGE
                             // for non generic is broken as it has 
                             // invalid methods like COUNT and SKIP etc.

Я попытался удалить неуниверсальную версию GetPage, но затем мой не универсальный Iqueryable не получает расширение из-за того, что оно не Iqueryable, а только IQueryable

Ответы [ 2 ]

14 голосов
/ 26 ноября 2010

Ну, просто эти методы недоступны для IQueryable.Если вы посмотрите на Queryable методы , вы увидите, что они почти все основаны на IQueryable<T>.

Если ваш источник данных будет действительно IQueryable<T> во время выполнения, и вы просто не знаете, что такое T, тогда вы сможете выяснить это с помощью отражения ... или в C # 4 просто используйте динамическую типизацию:

public static IQueryable GetPage(this IQueryable query,
     int page, int pageSize, out int count)
{
    int skip = (int)((page - 1) * pageSize);
    dynamic dynamicQuery = query;
    count = Queryable.Count(dynamicQuery);
    return Queryable.Take(Queryable.Skip(dynamicQuery, skip), pageSize);
}

Динамический бит компилятора C # позаботится о разработке T для вас во время выполнения.

В общем, я бы рекомендовал вам просто попробовать использовать универсальныйвместо этого формировать везде - это, вероятно, будет значительно проще.

0 голосов
/ 20 августа 2012

Вопрос старый, но когда кому-то нужны методы расширения IQueryable, он / она должен вернуть IQueriable, когда возвращаемый тип является анонимным.

...