IQueryable (non generic) : missing Count and Skip ? it works with IQueryable<T>

别来无恙 提交于 2019-11-30 04:17:33

问题


i have an extension method which a person was really helpful to give me... it does an orderby on IQueryable ... but i wanted one to do a normal IQueryable (non generic)

Here is the code, The count and Skip and i think Take are missing .

   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
    }

Here is the and it works perfectly no errors.

    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);
    }

Any ideas how i can get around this? I don't want to change my return types as it works perfectly and i have another extension method called ToDataTable and it also functions on a non generic IQueryable ..

Is there a work around?

Thanks in advance

EDIT

I call it like so on an existing 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.

I tried removing the GetPage non generic version but then my non Generic Iqueryable doesn't pickup the extension due to the fact its not a Iqueryable but only an IQueryable


回答1:


Well, quite simply those methods aren't available for IQueryable. If you look at the Queryable methods you'll see they're almost all based on IQueryable<T>.

If your data source will really be an IQueryable<T> at execution time, and you just don't know what T is, then you could find that out with reflection... or in C# 4, just use dynamic typing:

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);
}

The dynamic bit of the C# compiler will take care of working out T for you at execution time.

In general though, I'd encourage you to just try to use the generic form everywhere instead - it's likely to be significantly simpler.




回答2:


The question is old but when someone needs the IQueryable extension methods then he/she should return IQueriable when the return type is anonymous.



来源:https://stackoverflow.com/questions/4285598/iqueryable-non-generic-missing-count-and-skip-it-works-with-iqueryablet

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!