2010-07-09 2 views
6

J'utilise une interface que j'ai trouvée, qui a une méthode qui prend une expression LINQ comme paramètre. Comment implémenter cette méthode pour utiliser l'expression LINQ? Je peux le voir très utile, mais ne sais pas comment écrire le code pour l'utiliser !!Implémenter un paramètre LINQ Expression

C'est une interface de référentiel.

signature

est ...

IQueryable<T> Get(Expression<Func<T, bool>> criteria); 
+3

vous voulez dire que vous voulez écrire votre propre méthode qui accepte une expression comme paramètre? Ou vous voulez utiliser un methond existant sur l'interface de quelqu'un d'autre? – Rup

+0

Je veux écrire la méthode qui accepte une expression en tant que paramètre. Thx Rup – SteveCl

+1

Je suis confus; la signature que vous avez montrée * démontre * comment accepter une 'Expression' en tant que paramètre ... –

Répondre

9

on dirait que vous cherchez quelque chose comme ceci:

List<T> myList = new List<T>(); 
... 
public IQueryable<int> Get(Expression<Func<int, bool>> criteria) 
{ 
    return myList.Where(criteria.Compile()).AsQueryable(); 
} 

Ceci passe votre expression criteria à la méthode linq Where. Vous pouvez alors l'appeler comme ceci:

foreach(var something in myClass.Get(o => o.someProperty == 10)) 
{ 
    ... 
} 

Bien sûr, c'est assez stupide; il serait préférable de simplement implémenter IEnumerable<T> ...

+0

merci, je savais que ce serait quelque chose de simple !!! :) – SteveCl

1

C'est une expression sous-jacente; quelque chose qui indique des données à inclure.

Donc, pour obtenir un seul enregistrement, vous pouvez utiliser:

int rowId = 123; 
var row = foo.Get(x => x.Id == rowId).Single(); 

Ou pour obtenir toutes les données correspondant à une condition que vous pouvez utiliser:

var allDeleted = foo.Get(x => x.IsDeleted).ToList(); 

Notez que cela devrait être composables, pour plus amusant:

var today = from row in foo.Get(x => x.DateCreated > DateTime.Today) 
      orderby row.Name 
      select new {row.Id, row.Name}; 
+0

Thx Mark, je suis OK avec l'utilisation des prédicats, je ne sais pas comment écrire la méthode qui accepte le prédicat. Thx – SteveCl

6

IQueryable<T> a une surcharge .Where() qui prend un paramètre Expression<Func<T>>. Quand en supposant que ce soit un dépôt de Linq2Sql ou Linq2Entities, quelque chose comme cela devrait fonctionner

class MyRepository 
{ 
    ObjectContext context = // initialize somehow; 


    public IQueryable<int> Get(Expression<Func<int, bool>> predicate) 
    { 
     return context.SomeObject.Where(predicate); 
    } 
} 

Si ce n'est pas le cas, et vous avez seulement une dénombrable, vous pouvez utiliser AsQuerably() comme la première étape de la chaîne pour le convertir à IQuerably, vous donnant la possibilité d'utiliser l'expression prédicat base:

public IQueryable<int> Get(Expression<Func<int, bool>> predicate) 
{ 
    return mySimpleList.AsQuerable().Where(predicate); 
} 
+0

Merci, j'ai donné la prime à BlueRaja, juste parce que c'était la première réponse ... merci bien, c'est très utile – SteveCl

+0

je pense (pas 100% sûr si) que le '.Compile' suivi de' .AsQueryable' est bien pire performance sage si vous utilisez une base de données. Avec linq2sql ou linq2entities, je pense qu'il va tout chercher et exécuter le prédicat en C# plutôt qu'en SQL. –

+0

C'est certainement la bonne réponse .... – Pluc

Questions connexes