Итак, вот краткая версия моих таблиц.Получить родительский объект на основе критериев дочернего критерия и включить
public class Line
{
// Bunch Of properties
// ...
public List<Tool> Tools {get;set;}
}
public class Tool
{
// Bunch Of properties
// ...
public List<Task> Tasks {get;set;}
}
public class Task
{
// Bunch Of properties
// ...
public List<SchedItem> SchedItems {get;set;}
}
public class SchedItem
{
public DateTime SchedDate {get;set;}
}
То, что я хочу, это запрос, который будет возвращать все Lines
, включая дочерние коллекции и их дочерние коллекции и т.д., основанные на, попадет ли SchedItem.SchedDate
в диапазоне дат.
Я попробовал следующее в LinqPad.
var line = (from p in Lines.Include(x => x.Tools.Select(m => m.Tasks.Select(s => s.SchedItems)))
from t in p.Tools
from m in t.Tasks
from s in m.SchedItems
where s.SchedDate >= StartDateQuery &&
s.SchedDate <= EndDateQuery
select p);
Это кажется мне неправильным, как возвращаемые данные, включая все SchedItems
не только те, на основании запроса.
ОБНОВЛЕНИЕ 1: Да, я думаю, что у меня есть мое понимание неправильно. Я поставил следующее на моей конфигурации контекста
db.Configuration.LazyLoadingEnabled = false;
db.Configuration.ProxyCreationEnabled = false;
Когда я запускаю код еще раз я получаю список из 33 Line
пунктов, не имеющих дочерних элементов. Должен быть только 1 элемент «Линия» со многими дочерними элементами.
Я изменил свой запрос на это, и теперь я получаю дочерние элементы, но счет Line
по-прежнему 33, что является неправильным.
var line = (from p in Lines
from t in p.Tools
from m in t.Tasks
from s in m.SchedItems
where s.SchedDate >= StartDateQuery &&
s.SchedDate <= EndDateQuery
select p).Include(x => x.Tools.Select(m => m.Tasks.Select(s => s.SchedItems)));
Я думаю, что это было задано много раз. Яркие загрузочные нагрузки ** сущности **. Это все или ничего. например при загрузке «Task.ShedItems» содержит все элементы, потому что это имеет место с точки зрения ** entity **. Если вы хотите применить фильтрацию, то вы должны использовать проекцию, а не 'Include' (которая игнорируется в таких сценариях). –
Ну ладно, спасибо за это, я посмотрю на это. – Gaz83