2017-08-15 39 views
1

我正在使用Dapper,DapperExtensions使用泛型模型的項目,我想知道如何使用DapperExtension.GetAll方法填充模型?DapperExtensions Generic <T>使用Predicates從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

想我會用我的答案,因爲我還沒有得到任何反饋積極或消極的

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自己移開。