2010-04-01 87 views
0

我试图在重写Gridview函数中运行Linq语句的Count()函数。基本上,我希望能够将一个linq查询分配给一个gridview,并且在我的新扩展gridview中的OnDataBound(e)事件中使用IQueryable检索计数。动态运行IQueryable方法

所以,我需要动态地将GridView.DataSource转换为我的LinqToSql IQueryable对象,以便我可以对它执行Count()函数。

这是我在哪里至今:

protected override void OnDataBound(EventArgs e) 
    { 
     IEnumerable _data = null; 
     if (this.DataSource is IQueryable) 
     { 
      _data = (IQueryable)this.DataSource; 
     } 
     System.Type dataSourceType = _data.GetType(); 
     System.Type dataItemType = typeof(object); 
     if (dataSourceType.HasElementType) 
     { 
      dataItemType = dataSourceType.GetElementType(); 
     } 
     else if (dataSourceType.IsGenericType) 
     { 
      dataItemType = dataSourceType.GetGenericArguments()[0]; 
     } 
     else if (_data is IEnumerable) 
     { 
      IEnumerator dataEnumerator = _data.GetEnumerator(); 

      if (dataEnumerator.MoveNext() && dataEnumerator.Current != null) 
      { 
       dataItemType = dataEnumerator.Current.GetType(); 
      } 
     } 
     Object o = Activator.CreateInstance(dataItemType); 
     object[] objArray = new object[] { o }; 
     RowCount = (int)dataSourceType.GetMethod("Count").Invoke(_data, objArray); 

任何想法?我对使用IQueryables和Linq非常了解,所以我可能会离开。我怎样才能让我的_data允许我运行Count函数?

+0

您有一个数据源实例,但您仍然在其类型上动态调用“固定”方法。为什么? – Slavo 2010-04-01 14:00:49

+0

最后3行只是我在刺探这整个事情... – Micah 2010-04-01 14:08:55

回答

1

这可能是最简单的方法(和在一定程度上关系到你自己的答案):

protected override void OnDataBound(EventArgs e) { 
    var count = 0; 
    if (DataSource is IQueryable) { 
     count = ((IQueryable)DataSource).OfType<object>().Count(); 
    } 
    else { 
     count = ((IEnumerable)DataSource).OfType<object>().Count(); 
    } 

    // use count here 
} 

假设查询提供程序足够智能以忽略转换为object,这应导致DB查询如果来源实际上是IQueryable,则可以计算该值。

0

改变这种

Object o = Activator.CreateInstance(dataItemType); 
    object[] objArray = new object[] { o }; 
    RowCount = (int)dataSourceType.GetMethod("Count").Invoke(_data, objArray); 

这个

RowCount = (int)_data.OfType<object>().Count(); 
+0

因为_data是IEnumerable类型,所以不会在DB内部执行。相反,你会拉回整个表并迭代它以获得计数。 – kvb 2010-04-01 14:34:07