Я думаю, что лучший вариант - это определить классы, представляющие объединенные данные, которые вы хотите вернуть (например, 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
, ваши пользователи могут получать продукты только в данной категории (которая делает невозможным получение всей таблицы из базы данных)