2017-08-15 2 views
1

Je travaille sur un projet qui utilise Dapper, DapperExtensions utilisant des modèles génériques et je me demande comment je peux remplir un modèle en utilisant la méthode DapperExtension.GetAll?DapperExtensions Générique <T> Remplir le modèle en utilisant des prédicats de SeparateModels

Voici le code sql qui retourne les enregistrements que j'essaie de filtrer en utilisant DapperExtensions.

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 

je fait quelques recherches et trouvé que vous pouvez utiliser le Split.on mais ne sais pas si ce serait approprié dans cette situation ou non

La méthode GetAll ressemble à ce que nous avons la capacité filtrer sur les enregistrements

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

Toute aide serait grandement appréciée. J'ai amusé l'idée de créer aussi un SPROC pour peupler le modèle. Juste essayer de déterminer l'itinéraire le plus efficace.

Eh bien, j'ai réussi à peupler mon modèle en utilisant la méthode suivante, j'aimerais toujours entendre des commentaires ou des suggestions possibles.

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

Répondre

0

Devinez je vais utiliser ma réponse puisque je ne l'ai pas obtenu des commentaires

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

positif ou négatif Dapper Extensions ne prend pas en charge les procédures stockées, mais Dapper fait.

Pour votre code, le SP ressemblerait à quelque chose comme ceci:

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

Votre procédure stockée exécuterait la requête de sélection que vous avez dans le code. J'utiliserais une procédure stockée pour une raison très simple: Si vous avez besoin de changer les méthodes de sélection, le changer dans Sql est beaucoup plus facile qu'un changement dans le programme lui-même.

Je me suis éloigné de DapperExtensions en raison du manque de documentation sur son utilisation et du fait qu'il n'a pas été mis à jour depuis un moment.