2017-08-15 56 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自己移开。