2017-08-15 7 views
1

Dapperを使用するプロジェクト、DapperExtensionsを汎用モデルで使用していて、DapperExtension.GetAllメソッドを使用してモデルを作成する方法が不思議です。DapperExtensions Generic <T> SeparateModelsからの述語を使用してモデルを作成する

以下は、DapperExtensionsを使用してフィルタリングしようとしているレコードを返すSQLコードです。

select f.* 
from Item f 
where f.CurrentStatus = 'Open' 
AND f.ItemID not in (SELECT ItemID FROM ItemLog l WHERE f.ItemID = l.ItemID 
AND l.Status != 'Escalated' 
AND DateLogged <= DATEADD(mi, 25, GetDate())) //<- this value would be replaced with a variable 

私はいくつかの研究を行なったし、あなたがSplit.onを使用することができたが、GETALLメソッドは次のようになります。このような状況ではかない

ことが適切であるならば、私たちは能力を持っているかわかりませんレコードをフィルタリングするには

public virtual IEnumerable<TModel> GetAll(IList<DbFilter<TModel>> filters = null) 
{ 
    filters = filters ?? new List<DbFilter<TModel>>(); 
    using (var db = Context) 
    { 
     var pg = new PredicateGroup { Operator = GroupOperator.And, Predicates = new List<IPredicate>() }; 
     foreach (var filter in filters) 
     { 
      pg.Predicates.Add(Predicates.Field(filter.FilterExpression, filter.FilterOperator, filter.FilterItem)); 
     } 
      return db.GetList<TModel>(pg).ToList(); 
     } 
} 

ご協力いただければ幸いです。私はモデルを作成するためにSPROCを作成するという考えを楽しんでいます。最も効率的なルートを決定しようとしています。

私は次の方法でモデルを作成できましたが、まだフィードバックや考えられる提案を聞いています。

public async Task<IEnumerable<FormsFnol>> GetLateItems(DateTime responseTime) 
{ 
    IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString); 
    var items = await db.QueryAsync<FormsFnol>(@" 
     SELECT f.* 
     FROM Item f 
     WHERE f.CurrentStatus = 'Open' 
     AND f.ItemID not in (SELECT ItemID FROM ItemLog l WHERE f.ItemID = l.ItemID 
     AND l.Status != 'Escalated' 
     AND DateLogged <= @dateTime 
    ", new { @dateTime = responseTime}); 

    return items; 
} 

答えて

0

は、私はDapperの拡張機能は、ストアドプロシージャをサポートしていませんが、Dapperのはありません任意のフィードバック正または負の

public async Task<IEnumerable<FormsFnol>> GetLateItems(DateTime responseTime) 
{ 
IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString); 
var items = await db.QueryAsync<FormsFnol>(@" 
    SELECT f.* 
    FROM Item f 
    WHERE f.CurrentStatus = 'Open' 
    AND f.ItemID not in (SELECT ItemID FROM ItemLog l WHERE f.ItemID = l.ItemID 
    AND l.Status != 'Escalated' 
    AND DateLogged <= @dateTime 
", new { @dateTime = responseTime}); 

return items; 
} 
1

をもらっていないので、私は私の答えを使用しますね。

あなたのコードの場合、SPは次のよ​​うになります:

result = dbConnection.Query<FormsFnol>("FormsFnol_s", 
             new { dateTime = responseTime}, 
             null, 
             true, 
             null, 
             CommandType.StoredProcedure); 

あなたのストアドプロシージャを使用すると、コードを持っている選択クエリを実行することになります。私は非常に単純な理由でストアドプロシージャを使用します。選択メソッドを変更する必要がある場合は、SQLで変更することはプログラム自体の変更よりもはるかに簡単です。

私は、DapperExtensionsの使い方に関する文書の欠如と、しばらくのうちに実際に更新されていないという事実のため、DapperExtensionsから離れています。

関連する問題