2010-07-09 9 views
6

Estoy usando una interfaz que encontré, que tiene un método que toma una expresión LINQ como parámetro. ¿Cómo implementaría este método para usar la expresión LINQ? Puedo ver que es muy útil, ¡pero no se cómo escribir el código para usarlo!Implementar un parámetro LINQ Expression

Es una interfaz de repositorio.

firma es ...

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

¿Quiere decir que quiere escribir su propio método que acepte una Expresión como parámetro? ¿O quieres usar un methond existente en la interfaz de otra persona? – Rup

+0

Quiero escribir el método que acepta una Expresión como parámetro. Thx Rup – SteveCl

+1

Estoy confundido; la firma que ha mostrado * demuestra * cómo aceptar una 'Expresión' como parámetro ... –

Respuesta

9

Suena como que busca algo como esto:

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

Esto pasa su expresión criteria al método de linq Where. Puede llamarlo así:

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

Por supuesto, esto es bastante estúpido; sería mejor implementar IEnumerable<T> ...

+0

gracias, sabían que sería algo simple! :) – SteveCl

1

Esa es una expresión de predicado; algo que indique datos para incluir.

Por lo tanto, para obtener un registro único que podría utilizar:

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

o para obtener todos los datos coinciden con alguna condición que puede usar:

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

Tenga en cuenta que esto debería ser componibles, para más diversión:

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

Thx Mark, estoy de acuerdo con el uso de los predicados, simplemente no sé cómo escribir el método que acepta el predicado. Thx – SteveCl

6

tiene una sobrecarga .Where() que toma un parámetro Expression<Func<T>>. Cuando el supuesto de que este es un repositorio Linq2Sql o Linq2Entities, algo como esto debería funcionar

class MyRepository 
{ 
    ObjectContext context = // initialize somehow; 


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

Si ese no es el caso, y sólo tiene un enumerable, puede utilizar AsQuerably() como el primer paso de la cadena para convertirlo IQuerably, dándole la opción de usar el predicado basado en expresión:

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

Gracias, di la recompensa a BlueRaja, solo porque era la primera respuesta ... gracias, es muy útil – SteveCl

+0

Creo (aunque no 100% seguro) que el '.Compile' seguido de' .AsQueryable' es mucho peor en cuanto al rendimiento si estás usando una base de datos. Con linq2sql o linq2entities, creo que buscará todo y ejecutará el predicado en C# en lugar de hacerlo en SQL. –

+0

Esta es definitivamente la respuesta correcta .... – Pluc

Cuestiones relacionadas