IQueryable(非泛型):缺少Count和Skip?它适用于IQueryable <t> </t>

时间:2010-11-26 13:17:49

标签: linq linq-to-sql extension-methods iqueryable

我有一个扩展方法,一个人真的很乐意给我...它在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上运行..

有解决方法吗?

提前致谢

修改

我在现有的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非通用版本,但后来我的非Generic Iqueryable没有获取扩展,因为它不是Iqueryable但只有IQueryable

2 个答案:

答案 0 :(得分:14)

嗯,很简单,这些方法不适用于IQueryable。如果您查看Queryable methods,您会发现它们几乎都基于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

总的来说,我鼓励你尝试在任何地方使用通用表单 - 它可能会更加简单。

答案 1 :(得分:0)

问题是陈旧但当有人需要IQueryable扩展方法时,他/她应该在返回类型是匿名时返回IQueriable。