Mar*_*tin 7 linq extension-methods iqueryable linq-to-sql
我有一个扩展方法,一个人真的很有帮助给我...它在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
}
Run Code Online (Sandbox Code Playgroud)
这是完美的,没有任何错误.
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);
}
Run Code Online (Sandbox Code Playgroud)
任何想法我怎么能解决这个问题?我不想改变我的返回类型,因为它完美地工作,我有另一个名为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.
Run Code Online (Sandbox Code Playgroud)
我尝试删除GetPage非泛型版本,但后来我的非Generic Iqueryable没有获取扩展,因为它不是Iqueryable而只是一个IQueryable
Jon*_*eet 17
嗯,很简单,这些方法不适用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);
}
Run Code Online (Sandbox Code Playgroud)
C#编译器的动态位将T在执行时为您解决问题.
总的来说,我鼓励你尝试在所有地方使用通用形式 - 它可能会更加简单.
| 归档时间: |
|
| 查看次数: |
3054 次 |
| 最近记录: |