2013-10-09 1 views
6

Der Versuch, Wiederholung in meinem Code zu reduzieren, indem eine generische Methode GET machen. Ich benutze OrmLite und seine SQLExpressionVisitor Aktualisierung ... Das Ziel ist es, ein Lambda zu übergeben. Ich habe ein paar andere Beiträge gesehen, von denen ich gehofft habe, dass sie helfen, aber bis jetzt, nein ... Es ist klar, das Problem ist, wie ich versuche, die Kriterien in der ev.Where Aussage zu bewerten, aber die Lösung entgeht mir. ..Allgemeinabfragemethode

Vielen Dank im Voraus ... -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(); 
    } 
} 

Dies ist der Fehler, den ich bekommen ... Variable 'x' vom Typ 'TW.Api.Models.CostCenter' von Umfang verwiesen '', aber es ist nicht definiert

Hier ist ein Beispiel für Code, der funktioniert, ist aber nicht generisch ....

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(); 
    } 
} 

Dies ist das Modell, das ich oben verwiesen ...

[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; } 
} 

für all dies zu lesen, hier ist der endgültige Code ...

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

Nimm dir nicht eine 'Expression benötigen > criteria' anstelle eines' Prädikats criteria' in Ihrem generischen Methode? – Jehof

+0

Danke Jehof, das hat mich auf den richtigen Weg gebracht ... – Lenny

Antwort

2

Sie benötigen einen Expression<Func<T, bool>> stattdessen verwenden eines Predicate<T> als Parameter für Ihre generische Methode.

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