Uproszczenie metod

0

Witam,
zauważyłem że w moim dao jest kilka metod podobny do siebie, które różnią się od siebie jedynie wyrażeniem where np

class DAO{

public getDocumentIsReadyList(){
using(var db = new MigContex()){
   var model = ( from d in db.Document
                      where d.IsReady == true 
                      select d).ToList()
  return model; 
}
}

public getDocumentList(){
using(var db = new MigContex()){
   var model = ( from d in db.Document
                      select d).ToList()
  return model; 
}

public getDocumentToPrepare(){
using(var db = new MigContex()){
   var model = ( from d in db.Document
                      where d.transferDate != null
                      select d).ToList()
  return model; 
}
}

Class A {

List<Document> getDocument (DocumentType type) {
switch(type)
case DocumentType.All:
   return dao.getDocumentList(); 
case DocumentType.ToPrepare:
   return dao.getDocumentIsReadyList(); 
case DocumentType.IsReady:
   return dao.getDocumentToPrepare(); 
}
 }

Czy da się to jakoś uprościć ?

1

Zapisać to zapytanie w notacji metodowej (db.Documents.Where(expression).ToList()), a expression (coś w rodzaju Expression<Func<Document, object>>) uczynić parametrem metody.
Zamiast switch zrobić słownik, który będzie mapował typ dokumentu na odpowiedni warunek filtrujący: Dictionary<DocumentType, Expression<Func<Document, object>>>.

0

Dzięki za podpowiedź :) faktycznie działa.
mam pytanko od razu dotyczące include mianowicie jeśli dostarczę listę tabel które mają być dołączone to jak to zrobić ? bo jeśli dostarczam pojedynczą to jest w porządku, ale jak dołączyć "masowo" ?

kod dla pojedynczego include

List<Document> getDocumentList(Expression<Func<Document,Object>>include){
using(var db = new MigContex()){
   var model = ( from d in db.Document
                      select d)
                    .Include(include)
                    .ToList()
  return model; 
}
0

Tak na oko powinno zadziałać, ale nie gwarantuję:

List<Document> GetDocuments(params Expression<Func<Document, object>>[] includes){
using(var db = new MigContex())
{
   var query = db.Document;
   foreach (var include in includes)
   {
      query.Include(include);
   }
   var documents = query.ToList();
   return documents;
}

Poprawiłem też kod, bo w C# metody nazywamy wielką literą, a klamerki stawiamy w nowych liniach.

0

też liczyłem że taki sposób zadziała ale niestety nie podpina.

var model = db.Document;
foreach(var item in includes)
{
   model.Include(model); 
}

Taki sposób nie działa. Aby Include poprawnie zadziałał musi być od razu użyty czyli

db.Document.Include(); 

ale co jeśli ja dostarczam listę ? Include nie przyjmuje jako argumentu listy :/
Ma ktoś pomysł jak to rozwiązac ?

2

Oczywiście zapomniałem o głupich szczegółach:

List<Document> GetDocuments(params Expression<Func<Document, object>>[] includes){
using(var db = new MigContex())
{
   var query = db.Document.AsQueryable();
   foreach (var include in includes)
   {
      query = query.Include(include);
   }
   var documents = query.ToList();
   return documents;
}

Teraz powinno być lepiej.

0

co specjalista to specjalista :)
Działa poprawnie, ale sam na to bym nie wpadł :P Dzięki wielkie

1 użytkowników online, w tym zalogowanych: 0, gości: 1