2013-10-09 38 views
6

一般的なGETメソッドを作成して、自分のコードの繰り返しを減らそうとしています。 OrmLiteとSQLExpressionVisitorの更新を使用しています...目標はラムダを渡すことです。私はいくつかの他の投稿を見てきましたが、今のところは助けてくれると思っています...問題はEv.Whereステートメントで評価される方法が問題ではありますが、解決策は私を逃げ出しています。スコープから参照..タイプの一般的なクエリメソッド

事前のおかげで... -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(); 
    } 
} 

これは私が取得エラーです... 変数 'X' 'TW.Api.Models.CostCenter' ''は定義されていませんが、定義されていません

以下は、動作するコードですが、一般的ではありません....

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

これは、私が上記の参照モデル...これを読んで、すべてのための

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

あり、ここでの最終的なコードは...あなたが代わりにExpression<Func<T, bool>>を使用する必要が

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

は、あなたが '式を必要とするドント<機能> criteria'代わりに、あなたの一般的な方法で'述語 criteria'の? – Jehof

+0

ありがとうございましたJehof、それは正しい軌道に乗っています... – Lenny

答えて

2

です汎用メソッドのパラメータとしてPredicate<T>を入力します。

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