2009-02-11 7 views
1

J'ai plusieurs requêtes identiques à l'exception du sujet et des paramètres de la requête et j'essaie de formuler une requête 'généralisée' pour éviter plusieurs lignes de code presque identiques.Généraliser la requête LINQ?

Je le code suivant:

Code Snippet

private IEnumerable doQuery(string rangeVar, 
          DataSet dsSubTable, 
          string qrySubject, 
          string subTableKey, 
          string subTableDescription, 
          string fldName) 
    { 
     qryStart = dtmpickFrom.Value; 
     qryEnd = dtmpickTo.Value; 

     var groupQuery = 
      from trans in dataSet.Transaction  
      where ((trans.T_Date >= qryStart) && (trans.T_Date <= qryEnd)) 
      from rangeVar in dataSet.dsSubTable <<<<<< 
       where trans.qrySubject == rangeVar.subTableKey 

      select new ..... <snipped> 

Le compilateur ne sera pas accepter le dsSubTable (montré < < < < <) avec le message suivant:

'ExpenditureLINQDataSets.Expenditure' ne contient pas de définition pour 'dsSubTable' et aucune méthode d'extension « dsSubTable » accepter un premier argument de type « ExpenditureLINQDataSets.Expenditure » pu être trouvée (vous manque une directive à l'aide ou une référence d'assemblage?) »

Je me rends compte, bien sûr (si j'essaie de donner à dsSubTable un type de dépense ..... seuls les noms de table réels définis dans mon DataSet apparaissent dans Intellisense.)

Est-il possible de généraliser de telles requêtes LINQ ou dois-je vivre avec plusieurs requêtes identiques? requêtes dans mon code?

Toute aide appréciée!

+0

Je suis sûr qu'il existe un moyen d'y parvenir, mais le code/question est très déroutant car je n'ai aucune idée de la façon dont fonctionne votre classe Expenditure. Pourriez-vous essayer de recréer le scénario dans un nouveau code de test qui ne dépend pas de tous vos objets métier pour aider les autres à comprendre? –

Répondre

1

Si vous transmettez dsSubTable en tant que DataTable, vous pouvez l'utiliser directement dans un fichier blah dans dsSubTable. Mais c'est comme si vous abusiez de Linq. La puissance de Linq est que ce n'est pas Sql, alors pourquoi écrivez-vous une méthode qui, au lieu de concaténer Sql ensemble, vous construisez une expression Linq.

Linq vous permet de penser à vos données en termes de Sets et c'est ce que je trouve vraiment puissant à ce sujet. Je vous encourage à réfléchir à ce que vous essayez d'accomplir lorsque vous appelez 'doQuery' et que vous codez ces requêtes en tant qu'opérations de première classe.

+0

Je ne pense pas que j'abuse de LINQ. Je l'utilise intensivement dans mon application. Je voulais juste savoir si je pouvais éviter de disperser beaucoup de requêtes très similaires à travers mon code. –

+0

Oh ça n'a rien à voir avec combien vous utilisez linq. Je dis juste que Linq vous permet de faire un pas en avant conceptuel, ce que vous essayez de faire ne reflète pas cela. Je sais que je ressemble à un âne, mais il y a probablement plus de problèmes de Model et d'Architecture impliqués par votre question que n'importe quoi – ecoffey

+0

Aussi, putain de limites de caractères sur un champ de commentaire :-P – ecoffey