2017-08-15 4 views
1

Ich arbeite an einem Projekt, das Dapper, DapperExtensions mit generischen Modellen verwendet und ich frage mich, wie ich ein Modell mit der DapperExtension.GetAll-Methode füllen kann?DapperExtensions Generic <T> Füllen Modell mit Prädikaten von SeparateModels

Unten ist der SQL-Code, der die Datensätze zurückgibt, die ich mit DapperExtensions filtern möchte.

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 

habe ich einige der Forschung und fand Sie die Split.on verwenden können, aber ich bin nicht sicher, ob das in dieser Situation angemessen wäre, oder nicht

Die GetAll Methode sieht wie folgt aus, so haben wir die Möglichkeit haben, um auf Aufzeichnungen zu filtern

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

Jede Unterstützung würde sehr geschätzt werden. Ich hatte die Idee, auch ein SPROC zu erstellen, um das Modell zu bevölkern. Nur versuchen, die effizienteste Route zu bestimmen.

Nun, ich habe es geschafft, mein Modell mit der folgenden Methode zu bevölkern, würde immer noch gerne Feedback oder mögliche Vorschläge hören.

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

Antwort

0

Raten werde ich meine Antwort verwenden, da ich kein Feedback positiv oder negativ

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

Dapper Extensions nicht unterstützt Stored Procedures bekommen haben, aber Dapper tut.

für Ihren Code, würde die SP in etwa so aussehen:

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

Ihre gespeicherte Prozedur die Auswahlabfrage durchführen würde, die Sie im Code. Ich würde eine gespeicherte Prozedur aus einem sehr einfachen Grund verwenden: Wenn Sie die Auswahlmethoden ändern müssen, ist das Ändern in Sql viel einfacher als eine Änderung im Programm selbst.

Ich habe mich von DapperExtensions selbst entfernt, weil es keine Dokumentation darüber gibt, wie es verwendet wird, und die Tatsache, dass es seit einiger Zeit nicht mehr aktualisiert wurde.