2010-07-08 21 views
0

J'ai un dépôt:Choisir la bonne collection/Liste pour mon dépôt

public ObservableCollection<ProjectExpenseBO> GetProjectExpenses() 
{ 
    //Get by query 
    IQueryable<ProjectExpenseBO> projectExpenseQuery = 
     from p in _service.project_expense 
     from e in _service.vw_employee 
     where p.employee_id == e.employee_id 
     select new ProjectExpenseBO() 
     { 
      ProjectExpenseID = p.project_expense_id 
      , EmployeeID = p.employee_id 
      , ProjectNumber = p.project_number 
      , PurchaseTypeID = p.purchase_type_id 
      , BuyerEmployeeID = p.buyer_employee_id 
      , PurchaseOrderNumber = p.purchase_order_number 
      , DeliveryDate = p.delivery_date 
      , EmployeeName = e.first_name + " " + e.last_name 
     }; 

    ObservableCollection<ProjectExpenseBO> projectExpenseCollection = new ObservableCollection<ProjectExpenseBO>(projectExpenseQuery); 
    return projectExpenseCollection; 
} 

Je me demande s'il est préférable de retourner un IList ou IEnumerable (au lieu d'un ObservableCollection) de mon dépôt depuis mon viewmodel peut finir par le mettre dans une ObservableCollection ou List, selon mon besoin. Par exemple, je peux renvoyer des données du référentiel ci-dessus vers une liste de données ou une liste déroulante en lecture seule, ou je peux vouloir les mêmes données dans un DataGrid éditable.

Je pense (et je pourrais me tromper) que je veux que mon dépôt retourne une liste de barebones, puis la convertisse en suites dont j'ai besoin dans le viewmodel. Est-ce que ma pensée est correcte? Voici ce que je pensais:

public IEnumerable<ProjectExpenseBO> GetProjectExpenses() 
{ 
    //Get by query 
    IQueryable<ProjectExpenseBO> projectExpenseQuery = 
     from p in _service.project_expense 
     from e in _service.vw_employee 
     where p.employee_id == e.employee_id 
     select new ProjectExpenseBO() 
     { 
      ProjectExpenseID = p.project_expense_id 
      , EmployeeID = p.employee_id 
      , ProjectNumber = p.project_number 
      , PurchaseTypeID = p.purchase_type_id 
      , BuyerEmployeeID = p.buyer_employee_id 
      , PurchaseOrderNumber = p.purchase_order_number 
      , DeliveryDate = p.delivery_date 
      , EmployeeName = e.first_name + " " + e.last_name 
     }; 
    return projectExpenseQuery; 
} 

Merci.

Répondre

2

Je retournerais personnellement un IEnumerable<T> ou IList<T> au lieu de ObservableCollection. Il y a plusieurs fois où vous n'avez pas besoin du comportement complet de ObservableCollection<T>, auquel cas vous mettez plus de ressources que nécessaire. J'aime votre deuxième mise en œuvre - cependant, sachez qu'il existe un inconvénient potentiel. Certaines personnes n'aiment pas renvoyer l'exécution différée IEnumerable<T> à partir d'un référentiel, car elle retarde l'exécution jusqu'à son utilisation. Bien qu'il ait l'avantage de potentiellement économiser des ressources, surtout si vous n'utilisez pas tout ou partie des énumérables, cela peut entraîner une exception plus tard (quand le IEnumerable<T> est réellement utilisé), au lieu de se produire dans votre dépôt vous-même.

Si cela vous dérange, vous pouvez simplement forcer l'exécution (appelez ToList() ou similaire).

+0

Merci! Je vais devoir voir comment l'exécution différée affectera mon application. J'ai trouvé ce fil et j'ai besoin de le lire un peu mieux: http://stackoverflow.com/questions/1168944/how-to-tell-if-an-ienumerablet-is-subject-to-deferred-execution – steveareeno

0

Personnellement, je retournerais un IEnumerable<T> si vous l'utilisez simplement pour remplir l'interface utilisateur. Pas besoin de retourner un List<T> si vous n'allez pas ajouter/supprimer des éléments.