Я использую ASP.NET MVC 3 с Entity Framework 4, использующей POCO, и хочу запросить набор и выбрать некоторые свойства для добавления в мою viewModel.Я нарисую упрощенную версию моей ситуации:
Ситуация:
У меня есть объект BananaTree
, содержащий коллекцию Banana
public class Banana
{
public int Id { get; set; }
public int Size { get; set; }
public TimeSpan Age { get; set }
public string Description { get; set; }
}
public class BananaTree
{
public int Id { get; set; }
public ICollection<Banana> Bananas { get; set; }
}
У меня также естьмодель представления BananaListItemViewModel
, используемая в представлении, показывающем список бананов для определенного бананового дерева.Это представление управляется BananaTreeController
public class BananaListItemViewModel
{
public int Id { get; set; }
public TimeSpan Age { get; set }
}
У меня есть действие Подробности на контроллере, например, так:
public ActionResult Details(int bananaTreeId)
{
var viewModel = from bananaTree in bananaTreeRepository.BananaTrees
where bananaTree.Id == bananaTreeId
from banana in bananaTree.Bananas
select new BananaListItemViewModel
{
Id = banana.Id,
Age = banana.Age
};
return View(viewModel);
}
Что я хочу изменить
Этоработает нормально, и теперь я выбираю только те элементы из базы данных, которые мне нужны для моей модели представления.Тем не менее, я хочу извлечь больше логики из моего контроллера и пытаюсь сделать это как можно больше.
Я хотел бы иметь функцию в моем хранилище, например, так:
IQueryable<Banana> GetBananas(int bananaTreeId)
{
return (from bananaTree in BananaTrees
where bananaTree.Id == bananaTreeId
select bananaTree.Bananas).Single().AsQueryable();
}
и использовать ее так:
public ActionResult Details(int bananaTreeId)
{
var viewModel = from banana in bananaTreeRepository.GetBananas(bananaTreeId)
select new BananaListItemViewModel
{
Id = banana.Id,
Age = banana.Age
};
return View(viewModel);
}
Вопрос
Мой вопрос, в этом случае, будут ли эти два запроса объединены и отправлены в базу данных за один раз, как в моем первом примере, или это сначала позволит полностью вывести все бананы из дерева из базы данных и выполнить второй запрос для этогосписок?Я бы предпочел первый случай.Если нет, могу ли я переписать запрос GetBananas
, чтобы получить такое поведение (например, как запрос ниже)?
IQueryable<Banana> GetBananas(int bananaTreeId)
{
return from bananaTree in BananaTrees
where bananaTree.Id == bananaTreeId
from banana in bananaTree.Bananas
select banana;
}
Заранее большое спасибо.