У меня есть база данных со следующими таблицами:
create table Categories (
Id int primary key,
Name nvarchar(256) not null)
create table Products (
Id int primary key,
Name nvarchar(256) not null,
CategoryId int not null,
foreign key (CategoryId) references Categories (Id))
Используя DataLoadOptions
, я могу написать это:
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Category>(c => c.Products);
и получить всю информацию о категориях и продуктах водин запрос.
Однако db.Categories.First()
, db.Categories.FirstOrDefault()
и db.Categories.Take(10)
выполнят запрос, который извлекает только подмножество записей из таблицы Categories
и ничего больше.По сути, это:
SELECT TOP (1) Id, Name FROM Categories
-- and
SELECT TOP (10) Id, Name FROM Categories
Доступ к свойству Products
экземпляра Category
приведет к выполнению другого запроса.
Я обнаружил несколько способов обойти это.
// For First():
var category = db.Categories.Single(c => c == db.Categories.First());
// For FirstOrDefault():
var category = db.Categories.SingleOrDefault(c => c == db.Categories.First());
// For Take(10):
var categories = db.Categories.Where(c => db.Categories.Take(10).Contains(c));
Все приведенные выше операторы LINQ будут возвращать всю информацию о категории и продукте для подмножества Categories
записей в одном запросе.
Кто-нибудь знает, существуетлучший или более эффективный способ достижения этого?Спасибо.