Свойство навигации сложного запроса LINQ - PullRequest
9 голосов
/ 06 октября 2011

У меня проблема с получением данных из моей базы данных с помощью LINQ

У меня есть две таблицы Team и TeamMember, которые связаны отношением 1-N .Я использую Entity Framework, и у меня есть одна сущность для каждой из таблиц со свойством для каждого столбца.Также в сущности Team есть свойство навигации TeamMember как результат этого отношения.

Я хочу сделать запрос, чтобы я мог получить все свои команды с их членами команды.

result = (from t in this.context.Teams
          orderby t.Name
          select t)
         .Include("TeamMembers")

Это отлично работает.Я получаю коллекцию командных сущностей со свойством Team.TeamMember, заполненным данными члена каждой команды.

Проблема заключается в том, что я хочу выполнить более сложный запрос, такой как фильтрация запроса для TeamMembers.

Например, в обеих таблицах есть столбец EndDateTime.Если я хочу получить всю команду и членов команды, которые не закончили (время их окончания не равно нулю), я не знаю, как это сделать.

С помощью этого запроса я буду фильтровать только команды,но не члены команды.

result = (from t in this.context.Teams
          where t.EndDateTime == null
          orderby t.Name
          select t)
         .Include("TeamMembers")
         .ToList();

Есть идеи?

Я как бы "решаю" это, выполняя фильтрацию члена после запроса в коллекцию.Вот так:

//Filter out the End dated care coordiantors
var careCoordinatorsToDelete = new List<CareCoordinator>();
foreach (var team in result)
{
    careCoordinatorsToDelete.Clear();

    foreach (var careCoordinator in team.CareCoordinators)
    {
        if (careCoordinator.EndDateTime != null)
            careCoordinatorsToDelete.Add(careCoordinator);
    }

    foreach (var toDelete in careCoordinatorsToDelete)
    {
        team.CareCoordinators.Remove(toDelete);
    }
}

Но я не думаю, что это хорошее решение вообще.

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Как я уже говорил, я думаю, что это дубликат.Но суммируя ответы, вам просто нужно включить предложение Where в дочерний элемент как часть оператора Select (используя его как часть анонимного типа), перечислить запрос, а затем получить нужные вам объекты.

Поскольку вы выбрали TeamMembers, который вы хотите, в другом свойстве, они будут извлечены из базы данных и построены в вашем графе объектов.

result = (from t in this.context.Teams
          where t.EndDateTime == null
          orderby t.Name
          select new 
          { 
              Team = t,
              Members = t.TeamMembers.Where(tm => tm.EndDateTime == null)
          })
         .ToList()
         .Select(anon => anon.Team)
         .ToList();
0 голосов
/ 02 января 2013

это должно работать:

var result = this.context.Teams.Where(t=>t.EndDateTime==null).Select(t=>
new { Name = t.Name,
             PropertyX = t.PropertyX... //pull any other needed team properties.
             CareCoordinators = t.CareCoordinators.Where(c=>c.EndDateTime==null)
}).ToList();

это возвращает список анонимных объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...