动态.Skip()和.Take()IQueryable <anonymoustype> </anonymoustype>

时间:2011-12-02 16:15:15

标签: c# casting anonymous-types

我有一个DataSource属性为Object的网格控件,现在我想将DataSource投射到IQueryable<T>以获取和跳过喜欢此代码

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

但我不知道如何将Object投射到IQueryable<T>?大部分时间类型的数据都是IQueryable<AnonymousType>

3 个答案:

答案 0 :(得分:2)

几乎可以肯定有更好的方法来解决这个问题,但要按照要求回答您的问题,您可以使用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 :(得分:1)

是时候正确定义一个班级了。当匿名类型在创建它们的方法中完全自包含时,它们就很棒。当您演示需要在代码中的其他地方使用它们时,通过类定义记录类型,然后您可以在任何需要的地方使用该类,包括在演员表中。创建类定义后,只需在需要的地方按名称引用类。

查询:

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

方法返回类型

public IQueryable<ClassName> GetData()

并施展

var data = (IQueryable<ClassName>)theDataSource;

答案 2 :(得分:0)

为什么不使用PagedDataSource作为网格的来源,让它为您完成工作?

Paging using PagedDataSource class - CodeProject