2010-02-28 44 views
0

让我们假设我有以下3个实体:客户,订单,产品,在视图与CustomerOrderProductViewModel.cs互动:通过SqlDataReader的撷取来自数​​据库的相关数据,并推入视图模型/ ViewModelCollections

我有这样几个控件列表框,数据网格等等,以在我的视图中显示这些实体。

这些实体应该被提取到某种急切的加载。这意味着我的DAL中有3个sqldatareader。每个sqldatareader从Customer,Product,Order表中读取数据。我现在要考虑的是什么如何将订单输入产品和产品到客户列表中?将3个for-loop中的每个相关数据读入对方?如何将相关数据存入我的VMCollections中,以便Master Detail保持不变。

MVVM纯粹主义者和阿尔法极客对这个话题非常沉默。

回答

1

你可以使用LINQ来做这件事情,假设你的业务对象上有构造函数设置来处理DataReader和一个要复制的对象。虽然,我对你的查询结构有点困惑,但我认为这就是你所说的。

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

我可以使用的链接是...但如何做到不使用LINQ到对象?在for-each中循环所有3个集合不会完成这项工作,并且每次使用.Find()方法来获取id应该运行得非常慢......此外,如何读取CustomerViewModel/Collection中的相关数据, OrderviewModel/Collection等...? – msfanboy 2010-03-01 20:04:40

+0

时光流逝,经验太多;-)你的回答是对的,当然是适应性的... – msfanboy 2010-05-16 21:20:04

相关问题