【问题标题】:Dynamically .Skip() and .Take() IQueryable<AnonymousType>动态 .Skip() 和 .Take() IQueryable<AnonymousType>
【发布时间】:2011-12-03 00:39:47
【问题描述】:

我有一个网格控件,其 DataSource 属性为 Object,现在我想将我的 DataSource 转换为 IQueryable&lt;T&gt; 以获取并跳过喜欢此代码

var pagedData = ((IQueryable&lt;T&gt;) DataSource).Skip(20).Take(10);

但我不知道如何将Object 转换为IQueryable&lt;T&gt;?大部分时间类型的数据也是IQueryable&lt;AnonymousType&gt;

【问题讨论】:

    标签: c# casting anonymous-types


    【解决方案1】:

    几乎肯定会有更好的方法来解决这个问题,但要按要求回答您的问题,您可以使用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,不幸的是,您将不得不使用反射。

    【讨论】:

      【解决方案2】:

      是时候正确定义一个类了。当匿名类型在创建它们的方法中完全独立时,它们是很棒的。当您证明需要在代码的其他地方使用它们时,通过类定义记录类型,然后您可以在任何需要它的地方使用该类,包括在强制转换中。创建类定义后,只需在需要的地方按名称引用该类即可。

      查询:

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

      方法返回类型

      public IQueryable<ClassName> GetData()
      

      然后投射

      var data = (IQueryable<ClassName>)theDataSource;
      

      【讨论】:

        【解决方案3】:

        为什么不直接使用 PagedDataSource 作为您的网格的来源并让它为您工作?

        Paging using PagedDataSource class - CodeProject

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-10-20
          • 2018-02-03
          • 1970-01-01
          • 2012-06-12
          • 2018-03-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多