2013-10-09 7 views
6

Provare a ridurre la ripetizione nel mio codice facendo un metodo GET generico. Sto usando OrmLite e il suo aggiornamento SQLExpressionVisitor ... L'obiettivo è passare un lambda. Ho visto alcuni altri post che speravo sarebbe stato d'aiuto ma finora, non andare ... È chiaro che il problema è come sto cercando di ottenere i criteri valutati nella dichiarazione ev.Where, ma la soluzione mi sta sfuggendo. ..Metodo query generico

Grazie in anticipo ... -Lenny

public IQueryable<T> Get<T>(Predicate<T> criteria) 
{ 
    using (IDbConnection db = dbConnectionFactory.OpenDbConnection()) 
    { 
    SqlExpressionVisitor<T> ev = OrmLiteConfig.DialectProvider.ExpressionVisitor<T>(); 
    ev.Where(x => criteria.Invoke(x)) 
    return db.Select(ev).AsQueryable(); 
    } 
} 

Questo è l'errore che ottengo ... variabile 'x' di tipo 'TW.Api.Models.CostCenter' riferimento dal campo di applicazione '', ma non è definito

Ecco un esempio di codice che funziona ma non è generico ....

public IQueryable<CostCenter> Get(Identity user) 
{ 
    using (IDbConnection db = dbConnectionFactory.OpenDbConnection()) 
     { 
     SqlExpressionVisitor<CostCenter> ev = OrmLiteConfig.DialectProvider.ExpressionVisitor<CostCenter>(); 
     ev.Where(x => x.OrgId == user.OrgId); 
     ev.Where(x => x.VisibilityStockpointId == user.StockpointId);`` 
     return db.Select(ev).AsQueryable(); 
    } 
} 

Questo è il modello ho fatto riferimento in precedenza ...

[Alias("CostCenterDetail")] 
public class CostCenter 
{ 
    public Guid Id { get; set; } 
    public Guid StockpointId { get; set; } 
    public virtual Guid? VisibilityStockpointId { get; set; } 
    public string Description { get; set; } 
    public string Number { get; set; } 
    public string OrgId { get; set; } 
} 

per tutti la lettura di questo, ecco il codice finale ...

public IQueryable<T> Get<T>(Expression<Func<T, bool>> criteria) 
{ 
    using (IDbConnection db = dbConnectionFactory.OpenDbConnection()) 
    { 
     return db.Select(criteria).AsQueryable(); 
    } 
} 
+1

Non tiratevi avete bisogno di un 'Expression > criteria' invece di un' Predicate Criteria' nel vostro metodo generico? – Jehof

+0

Grazie Jehof, questo mi ha messo sulla strada giusta ... – Lenny

risposta

2

È necessario utilizzare un Expression<Func<T, bool>> invece di un Predicate<T> come parametro per il tuo metodo generico.

public IQueryable<T> Get<T>(Expression<Func<T, bool>> criteria) { 
    using (IDbConnection db = dbConnectionFactory.OpenDbConnection()) 
    { 
     return db.Select(criteria).AsQueryable(); 
    } 
}