Entity Framework consulta # 1
-
10-07-2019 - |
Pergunta
Eu estou tentando descobrir como limitar o meu conjunto de dados filho para incluir apenas registos activos ...
// Here's what I have currently...
m_BackLoggerEntities.Stories
.Include("Sprints")
.Include("Tasks")
.Include("Efforts")
.Include("Products")
.First(s => s.StoryId == id);
// Here's what I thought I could do...
m_BackLoggerEntities.Stories
.Include("Sprints")
.Include("Tasks")
.Include("Efforts")
.Include("Products")
.Where(s => s.Tasks.Active)
.First(s => s.StoryId == id);
// I also tried this...
m_BackLoggerEntities.Stories
.Include("Sprints")
.Include("Tasks")
.Include("Efforts")
.Include("Products")
.First(s => s.StoryId == id && s => s.Tasks.Active));
Obviamente nenhum deles estão trabalhando. Eu não tenho certeza de que outra forma de fazer isso ...
Solução
Dê uma olhada em Alex James Dica 37 . De acordo com o exemplo no artigo ligado, isso pode ser feito assim:
var query = from story in m_BackLoggerEntities.Stories
where story.StoryId == id
select new {
story,
Tasks = from task in story.Tasks
where task.Active
select task
};
var stories = query
.AsEnumerable()
.Select(x => x.Story);
Cada dentro História de "histórias" deve ter apenas tarefas ativas.
Outras dicas
Você precisa de algo como isto:
Model = m_BackLoggerEntities.Stories
.Include("Sprints")
.Include("Tasks")
.Include("Efforts")
.Include("Products")
.SingleOrDefault(s => s.StoryId == id);
Então, na sua opinião:
@foreach (var task in Model.Tasks.Where(t => t.Active))
A única maneira que eu encontrei para "simular" o que eu quero é usar ...
var storyToDetail =
m_BackLoggerEntities.Stories
.Include("Sprints")
.Include("Tasks")
.Include("Efforts")
.Include("Products")
.First(s => s.StoryId == id);
Em seguida, no foreach na vista ...
<% foreach (var task in Model.Tasks.Where(t => t.Active))
Mas isso, claro, traz de volta muitas mais registros, em seguida, eu quero.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow