2010-02-28 7 views
0

laisse supposer que j'ai les 3 entités suivantes: Client, Ordre, produit qui interagissent dans la vue avec les CustomerOrderProductViewModel.cs:Récupérer les données relatives de la base de données via sqldatareader et pousser dans ViewModel/ViewModelCollections

J'ai plusieurs contrôles comme listbox, datagrid, etc. pour afficher ces entités dans ma vue.

Ces entités doivent être récupérées en quelque sorte. Cela voudrait dire que j'ai 3 sqldatareader dans mon DAL. Chaque lecteur sqldatareader lit les données de la table Customer, Product, Order. Ce que je dois considérer maintenant Comment puis-je obtenir les commandes dans les produits et les produits dans la liste des clients? Lire toutes les données connexes dans 3 for-boucles l'un dans l'autre? Et comment puis-je obtenir ces données relachées dans mes VMCollections afin que les détails principaux restent intacts.

Les puristes MVVM et geeks alpha sont très silencieux sur ce sujet.

Répondre

1

Vous pouvez utiliser LINQ pour cette supposant que vous avez configuré des constructeurs sur vos objets métier qui gère un DataReader et un objet à copier. Bien que, je suis un peu confus au sujet de la structure de votre requête, mais je pense que c'est ce que vous dites.

public class ViewModel 
{ 
    public ViewModel(DAL dal) 
    { 
     Customers = dal.GetCustomerFull().ToList(); 
    } 

    public List<Customer> Customers { get; set; } 
} 

public class DAL 
{ 
    public IEnumerable<Customer> GetCustomerFull() 
    { 
     var customers = GetCustomers().ToList(); 
     var products = GetProducts().ToList(); 
     var orders = GetOrders().ToList(); 

     var query = from c in customers 
        select new Customer(c) 
        { 
         Products = from p in products 
            where p.Id = c.ProductId 
            select new Product(p) 
            { 
            Orders = from o in orders 
               where o.Id = p.OrderId 
               select o; 
            } 
        }; 

     return query; 
    } 

    public IEnumerable<Customer> GetCustomers() 
    { 
     // setup command 
     var reader = new SqlDataReader(cmd); 
     while (reader.Read()) 
     { 
      yield return new Customer(reader); 
     } 
    } 
} 
+0

Je peux utiliser le lien oui ... mais comment faire sans utiliser LINQ to Objects? boucler toutes les 3 collections dans un for-each ne fera pas l'affaire et en utilisant à chaque fois la méthode .Find() pour obtenir l'id devrait tourner très très lentement ... de plus comment lire ces données dans un CustomerViewModel/Collection, OrderviewModel/Collection etc ...? – msfanboy

+0

le temps passe et l'expérience aussi ;-) votre réponse était bien sûr et est adaptable ... – msfanboy

Questions connexes