2010-08-19 7 views
2

J'ai une requête de sélection qui est utilisée à plusieurs reprises avec différents where filtres:Création Linq réutilisable requêtes

var query = from row in context.Table select row; 

Comment puis-je enregistrer ce dans une variable de classe statique pour que je puisse le réutiliser dans différentes méthodes? Comme:

var results1 = query.Where(condition1); 
... 
var results2 = query.Where(condition2); 
+0

Je ne comprends pas. Comment est ce que vous voulez différent de ce que vous avez déjà? – Gabe

Répondre

5

Vous êtes sur la bonne voie.

Envisager la création d'une nouvelle méthode au lieu d'une variable:

public IQueryable<Cust> ListActiveCustomers() 
{ 
    return dataContext.Customers.Where(c=>c.IsActive==true); 
} 

Vous pouvez alors consommer ce ne importe où cette méthode est visible:

//Active Customers with no invoices due. 
var activePaidCustomers = ListActiveCustomers().Where(c=>c.InvoicesDue==0) 
               .OrderByDescending(c=>c.LastPaidOn) 
               .ToList(); 
+1

Comme je n'ai pas de ObjectContext global, j'ai créé une méthode List() paramétrée: private IQueryable List (MyContext ctx) {return ctx.Customers ...} – dstr

1

suffit de remplacer var avec IEnumerable<RowType> (ou IQueryable<RowType>) où RowType est le (non anonyme) le type de chaque élément de la séquence de résultats:

static IEnumerable<RowType> query = from ... select row; // row is of RowType. 
2

ce code:

var query = from row in context.Table select row; 

Fonctionnellement équivalent à:

var query = context.Table; 

Vous n'avez pas besoin de garder cette variable query de le réutiliser, il suffit d'utiliser context.Table directement:

var results1 = context.Table.Where(condition1); 
... 
var results2 = context.Table.Where(condition2); 
1

Eh bien, la première étape est de trouver le type de query exact. La meilleure façon est de parcourir si le code en utilisant dans le débogueur, et voir ce qu'il dit le type est (probablement IQueryable<RowType> ou IOrderedQueryable<RowType>)

3

Quelque chose comme ceci:

Expression<Func<TypeYoureQueryingAgainst, bool>> query = p => p.Value == someValue; // etc.. 

Ensuite, vous pouvez faire ce qui suit , où TypeYoureQueryingAgainst est dans le dépôt ou quel que soit le modèle que vous utilisez:

repository.Where(query); 

espoir qui fait sens ..

+0

Ca a du sens ... un peu. Comment envoyer un paramètre? J'ai créé ceci: Expression requête = (table, id) => table.Id == id ;. Je peux l'utiliser comme context.MyTable.Where (requête) mais comment puis-je envoyer le paramètre id à "query"? – dstr