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