通过sqldatareader从数据库中获取相关数据并推送到ViewModel / ViewModelCollections

时间:2010-02-28 19:09:35

标签: asp.net mvvm collections viewmodel master-detail

假设我有以下3个实体:客户,订单,产品在View中与CustomerOrderProductViewModel.cs交互:

我有几个控件,如listbox,datagrid等..在我的View中显示这些实体。

这些实体应该是一种急切的装载。这意味着我的DAL中有3 sqldatareader。每个sqldatareader从表Customer,Product,Order中读取数据。我现在需要考虑的事项如何将产品和产品的订单纳入客户列表?将3个for循环中的每个相关数据相互读取?如何将相关数据放入我的VMCollections中,以便Master Detail保持不变。

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

1 个答案:

答案 0 :(得分:1)

您可以使用LINQ,假设您在Business对象上设置了构造函数来处理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);
        }
    }
}