2010-04-01 7 views
0

J'essaie d'exécuter la fonction Count() d'une instruction Linq dans une fonction Gridview redéfinie. Fondamentalement, je veux être capable d'assigner une requête linq à un gridview, et sur l'événement OnDataBound (e) dans ma nouvelle grille étendue, il récupère le compte, en utilisant le IQueryable. Donc, j'ai besoin de lancer dynamiquement le GridView.DataSource à mon objet LinqToSql IQueryable afin que je puisse exécuter la fonction Count() par rapport à cela.Exécuter dynamiquement IQueryable, méthode

C'est là que je suis à ce jour:

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); 

Toutes les idées? Je suis vraiment nouveau avec travailler avec IQueryables et Linq, donc je peux être loin. Comment puis-je obtenir mes données pour me permettre d'exécuter la fonction Count?

+0

Vous avez une instance de la source de données, mais vous continuez d'appeler dynamiquement une méthode "fixe" sur son type. Pourquoi? – Slavo

+0

Ces 3 dernières lignes ne sont que des coups de poignard pour toute cette affaire ... – Micah

Répondre

1

Ceci est probablement le moyen le plus simple (et est quelque peu lié à votre propre réponse):

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 
} 

En supposant que la requête le fournisseur est assez intelligent pour ignorer la conversion à object, cela devrait entraîner une requête DB pour obtenir le compte si la source est réellement IQueryable.

0

changer cette

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

à cette

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

Parce que '_data' est de type' IEnumerable', cela ne s'exécutera pas dans la base de données. Au lieu de cela, vous allez retirer toute la table et la parcourir pour obtenir le compte. – kvb

Questions connexes