Извлечение связанных данных из базы данных через sqldatareader и отправка в ViewModel / ViewModelCollections - PullRequest
0 голосов
/ 28 февраля 2010

Предположим, у меня есть следующие 3 объекта: Клиент, Заказ, Продукт, которые взаимодействуют в представлении с CustomerOrderProductViewModel.cs:

У меня есть несколько элементов управления, таких как список, сетка данных и т. Д., Для отображения этих объектов в моем представлении.

Эти сущности должны быть загружены. Это означало бы, что в моем DAL есть 3 sqldatareader. Каждый sqldatareader считывает данные из таблицы Customer, Product, Order. Что я должен рассмотреть сейчас Как я могу получить Заказы на Продукты и Продукты в Списке клиентов? Читайте все связанные данные в 3 циклах друг за другом? И как мне передать эти данные в мои VMCollections, чтобы основная деталь осталась неизменной.

Пуристы и альфа-фанаты MVVM очень молчат об этой теме.

1 Ответ

1 голос
/ 28 февраля 2010

Вы можете использовать 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);
        }
    }
}
...