2010-07-05 10 views
2

J'ai une méthode qui obtient des lignes de ma base de données. Cela ressemble à ceci:ne linq où appel réduire les appels à ma base de données (construit sur mesure)

public static IEnumerable<Dictionary<string, object>> GetRowsIter() 
{ 
    _resultSet.ReadFirst(); 
    do 
    { 
     var resultList = new Dictionary<string, object>(); 
     for (int fieldIndex = 0; fieldIndex < _resultSet.FieldCount; fieldIndex++) 
     { 

      resultList.Add(_resultSet.GetName(fieldIndex), 
          _resultSet.GetValue(fieldIndex)); 
     } 
     yield return resultList; 
    } while (_resultSet.ReadRelative(1)); 
    yield break; 
} 

C'est génial quand je veux retourner toutes les lignes. Mais parfois je veux retourner seulement quelques lignes.

Je prévois d'écrire ma propre méthode (GetRowsIterWhere(string column, object whereValue)), mais je me demande si je peux utiliser le linq où sur ma méthode. J'avoue que je ne sais pas comment cela fonctionnerait, car j'avance le lecteur avec un ReadRelative (1) pour passer à la valeur suivante. Donc, même s'il «pense» qu'il saute des lignes, il ne les sautera pas vraiment.

Je suis vraiment préoccupé par la performance ici (je suis actuellement refactoring de Linq à datasets, car il était bien chemin trop lent.)

Alors, ma question est, dois-je écrire mon propre Where méthode de type ou puis-je changer celui ci-dessus pour travailler avec la méthode linq where?

Répondre

1

Oui, vous pouvez utiliser LINQ Where, mais vous devrez créer le prédicat vous-même. Ce n'est pas délicat. Quelque chose comme (de la mémoire, aucun compilateur à la main):

var param = Expression.Parameter(typeof(T), "row"); 
var body = Expression.Equal(
       Expression.PropertyOrField(param, column), 
       Expression.Constant(whereValue)); 
var lambda = Expression.Lambda<Func<T,bool>>(body, param); 

alors:

IQueryable<T> source = ... 
var filtered = source.Where(lambda); 

Cela entraînera le Where à exécuter sur le serveur (par exemple, dans TSQL), éliminant la plupart des le réseau IO (asusming un filtre sensible).

+0

WOW. Je pensais que j'étais juste pour décent à C#, mais je ne sais même pas où brancher cela. Je vais devoir faire quelques recherches avant de pouvoir l'utiliser. – Vaccano

+0

@Vaccano - votre commentaire; par exemple, avec LINQ-to-SQL, 'yourDataContext.SomeTable' est un' IQueryable '. –