2010-03-13 6 views
2

J'ai une instruction LINQ assez complexe à laquelle j'ai besoin d'accéder pour différentes méthodes. Chacune de ces méthodes peut avoir besoin de voir les données résultantes avec des paramètres différents. Pour une méthode, il peut s'agir d'un code de projet, pour un autre, il peut s'agir d'un langage. La déclaration est à peu près la même chose, c'est juste la partie où cela change.Utilisation d'une instruction LINQ avec différents paramètres

Je n'ai pas été en mesure de comprendre comment utiliser différentes où les déclarations sans dupliquer la totalité de l'instruction LINQ, et que tout simplement pas assez sec pour moi.

Par exemple (très simplifié):

var r = from c in customer 
     where c.name == "some name" 

// or it may be 

var r = from c in customer 
     where c.customerId == 8 

Est-il possible d'avoir deux dans la même déclaration que je puisse utiliser l'un ou l'autre en fonction de ce que je fais? J'ai essayé une instruction if pour utiliser l'une des déclarations where ou l'autre, et cela ne s'est pas très bien passé.

Répondre

3

Vous pouvez le faire comme ceci:

var r = from c in customer 
     select c; 

if (CustomerName != null) 
    r = r.Where(c => c.name == CustomerName); 
if (CustomerID != null) 
    r = r.Where(c => c.customerId == CustomerID); 

Vous pouvez faire ces else if si seulement on doit appliquer, dans mon exemple des critères qui n'était pas nulle seraient appliquées à la requête pour filtrer.

+0

Vous pourriez simplement attribuer 'client' à r en fonction de son type ou même réaffecter les résultats de la clause Where au client. Cela dépend du contexte. Par exemple, si les clients est Tableau , je pense que vous pouvez simplement faire 'var r = db.Customers.AsQueryable()', alors r serait '' IQueryable tvanfosson

+0

@tvanfosson - D'accord, si elle est une simple requête comme ça , préférable d'utiliser cette approche ... sonnait de la question comme si elle ne l'était pas. Je pense que dans votre exemple juste 'var r = db.Customers' fonctionne bien, puisque' Tableau : IQueryable ' –

+0

L'instruction LINQ est compliquée, bien que la seule différence entre les deux ou trois itérations est là déclaration. – Brettski

0

Vous pouvez passer un délégué Func à votre fonction (la clause Where prend un délégué Func avec un type de retour booléen). Ensuite, utilisez ce délégué dans la clause Where.

1

Qu'en est-il de quelque chose comme ça?

var useIdForFiltering = false; 

var r = from c in customer 
    where (useIdForFiltering && c.customerId == 8) || (c.name == "some name") 
+0

C'est une approche intéressante, merci. – Brettski

Questions connexes