Как запросы LINQ и слой Dao должны возвращать запросы в представление? - PullRequest
0 голосов
/ 09 февраля 2011

Когда я использовал ADO.NET, я использовал для создания адаптеров таблиц, которые были заполнены с помощью объединенных запросов, например, у адаптера таблицы продуктов был столбец для «местоположения», даже если базовый запрос на выборку соединял продукт с местоположением стол.

В LINQ, как мне это сделать? Вернуть ли столбцы в объединенном запросе, написав LINQ-запросы в классе ProductsDao? Какой тип я возвращаю для привязки к gridview? Проблема с возвратом результатов LINQ обратно заключается в том, что я мог бы подумать, что это нарушит согласованность класса ProductsDao (он должен возвращать только строки продукта из БД).

1 Ответ

2 голосов
/ 09 февраля 2011

Я думаю, что лучший вариант - это определить классы, представляющие объединенные данные, которые вы хотите вернуть (например, ProductDetails), а затем вернуть IQueryable<ProductDetails> из вашего уровня данных.

Чтобы вернуть запрос, вы можете написать простой запрос LINQ:

public IQueryable<ProductDetails> GetProducts() {
  return from p in db.Products
         join d in db.Details on p.ID equals d.ID
         select new ProductDetails { p.Name, d.Notes };
}

Этот подход имеет несколько преимуществ:

  • Вы не выставляете объект YourDataContext напрямую - он может оставаться частным полем класса DAO (если он недолговечный), или вы можете создать его так, как вам нужно.

  • Вы не выставляете основные сущности LINQ напрямую (например, Product или Details), поэтому пользователи не могут случайно связываться с вашей базой данных (если вы не предоставите им способ сделать это)

  • Вы возвращаете queryable , который просто представляет запрос. Когда пользователи добавляют свои дополнительные ограничения (например, where), запрос будет составлен, и вы не будете загружать ненужные данные.

  • Вы можете предоставить только разумные функциональные возможности из класса - например, если у вас есть только метод GetProducts, принимающий categoryID, ваши пользователи могут получать продукты только в данной категории (которая делает невозможным получение всей таблицы из базы данных)

...