2016-04-21 4 views
1

Мое приложение может использоваться для отправки сообщений в виде комбинации отдельных пользователей и групп, содержащих наборы пользователей. Структура такова, что объект Message имеет один объект Recipients, который, в свою очередь, имеет список объектов User и список объектов Team.Entity Framework Включает возврат различных значений для Single и Where

Я пытаюсь получить список объектов, использующих Message EF Code First и Linq к Entities, и я хочу, чтобы включить Recipients и Teams, чтобы избежать большого количества ленивых нагрузочных запросов позже.

Странная вещь, список команд всегда пуст, если я использую предложение Include. После некоторого экспериментирования, она сводится к следующему:

var messages = GetAll() 
    .Include(m => m.Recipients.Teams) 
    .Where(m => m.Id == 123) 
    .ToList(); 

возвращает список с одним сообщением, где Teams список пуст. (GetAll() просто возвращает IQueryable<Message>.) Но если я

var message = GetAll() 
    .Include(m => m.Recipients.Teams) 
    .Single(m => m.Id == 123); 

тогда я получаю одно сообщение с Teams правильно заселенной.

Любые идеи, почему это происходит?

Редактировать: Вот сгенерированный SQL (из Entity Framework Profiler)

Где заявление

SELECT * 
FROM (SELECT [Extent1].[Id]    AS [Id], 
       [Extent1].[ParentRelation] AS [ParentRelation], 
       [Extent1].[CreatedUtc]  AS [CreatedUtc], 
       [Extent1].[Subject]  AS [Subject], 
       [Extent1].[Introduction] AS [Introduction], 
       [Extent1].[Body]   AS [Body], 
       [Extent1].[GlobalId]  AS [GlobalId], 
       [Extent1].[Team_Id]  AS [Team_Id], 
       [Extent1].[Creator_Id]  AS [Creator_Id], 
       [Extent1].[Parent_Id]  AS [Parent_Id], 
       [Extent1].[ReplyTo_Id]  AS [ReplyTo_Id], 
       [Join1].[Id1]    AS [Id1], 
       [Join1].[ToSupervisors] AS [ToSupervisors], 
       [Join1].[Organisation_Id] AS [Organisation_Id], 
       [Join1].[Id2]    AS [Id2], 
       [Join4].[Id3]    AS [Id3], 
       [Join4].[Name]    AS [Name], 
       [Join4].[CreatedUtc]  AS [CreatedUtc1], 
       [Join4].[Description]  AS [Description], 
       [Join4].[Color]   AS [Color], 
       [Join4].[Status]   AS [Status], 
       [Join4].[Organisation_Id] AS [Organisation_Id1], 
       CASE 
       WHEN ([Join4].[Recipients_Id1] IS NULL) THEN CAST(NULL AS int) 
       ELSE 1 
       END      AS [C1] 
     FROM [dbo].[Messages] AS [Extent1] 
       INNER JOIN (SELECT [Extent2].[Id]    AS [Id1], 
            [Extent2].[ToSupervisors] AS [ToSupervisors], 
            [Extent2].[Organisation_Id] AS [Organisation_Id], 
            [Extent3].[Id]    AS [Id2] 
          FROM [dbo].[Recipients] AS [Extent2] 
            LEFT OUTER JOIN [dbo].[MessageExtensions] AS [Extent3] 
            ON [Extent2].[Id] = [Extent3].[Recipients_Id]) AS [Join1] 
       ON [Extent1].[Recipients_Id] = [Join1].[Id1] 
       LEFT OUTER JOIN (SELECT [Extent4].[Recipients_Id] AS [Recipients_Id1], 
             [Extent5].[Id]    AS [Id3], 
             [Extent5].[Name]   AS [Name], 
             [Extent5].[CreatedUtc]  AS [CreatedUtc], 
             [Extent5].[Description]  AS [Description], 
             [Extent5].[Color]   AS [Color], 
             [Extent5].[Status]   AS [Status], 
             [Extent5].[Organisation_Id] AS [Organisation_Id], 
             [Extent6].[Recipients_Id] AS [Recipients_Id2] 
           FROM [dbo].[RecipientsTeams] AS [Extent4] 
             INNER JOIN [dbo].[Teams] AS [Extent5] 
             ON [Extent4].[Team_Id] = [Extent5].[Id] 
             INNER JOIN [dbo].[MessageExtensions] AS [Extent6] 
             ON 1 = 1) AS [Join4] 
       ON ([Extent1].[Recipients_Id] = [Join4].[Recipients_Id2]) 
        AND ([Extent1].[Recipients_Id] = [Join4].[Recipients_Id1]) 
     WHERE 11021 = [Extent1].[Id]) AS [Project1] 
ORDER BY [Project1].[Id] ASC, 
      [Project1].[Id1] ASC, 
      [Project1].[Id2] ASC, 
      [Project1].[C1] ASC 

Одно заявление

SELECT * 
FROM (SELECT [Limit1].[Id1]    AS [Id], 
       [Limit1].[ParentRelation] AS [ParentRelation], 
       [Limit1].[CreatedUtc]  AS [CreatedUtc], 
       [Limit1].[Subject]   AS [Subject], 
       [Limit1].[Introduction] AS [Introduction], 
       [Limit1].[Body1]   AS [Body], 
       [Limit1].[GlobalId1]  AS [GlobalId], 
       [Limit1].[Team_Id]   AS [Team_Id], 
       [Limit1].[Creator_Id]  AS [Creator_Id], 
       [Limit1].[Parent_Id]  AS [Parent_Id], 
       [Limit1].[ReplyTo_Id]  AS [ReplyTo_Id], 
       [Limit1].[Id2]    AS [Id1], 
       [Limit1].[ToSupervisors] AS [ToSupervisors], 
       [Limit1].[Organisation_Id] AS [Organisation_Id], 
       [Limit1].[Id3]    AS [Id2], 
       [Join5].[Id4]    AS [Id3], 
       [Join5].[Name]    AS [Name], 
       [Join5].[CreatedUtc1]  AS [CreatedUtc1], 
       [Join5].[Description]  AS [Description], 
       [Join5].[Color]   AS [Color], 
       [Join5].[Status]   AS [Status], 
       [Join5].[Organisation_Id] AS [Organisation_Id1], 
       CASE 
       WHEN ([Join5].[Recipients_Id1] IS NULL) THEN CAST(NULL AS int) 
       ELSE 1 
       END      AS [C1] 
     FROM (SELECT TOP (2) [Extent1].[Id]    AS [Id1], 
           [Extent1].[ParentRelation] AS [ParentRelation], 
           [Extent1].[CreatedUtc]  AS [CreatedUtc], 
           [Extent1].[Subject]  AS [Subject], 
           [Extent1].[Introduction] AS [Introduction], 
           [Extent1].[Body]   AS [Body1], 
           [Extent1].[GlobalId]  AS [GlobalId1], 
           [Extent1].[Team_Id]  AS [Team_Id], 
           [Extent1].[Creator_Id]  AS [Creator_Id], 
           [Extent1].[Parent_Id]  AS [Parent_Id], 
           [Extent1].[ReplyTo_Id]  AS [ReplyTo_Id], 
           [Join1].[Id2], 
           [Join1].[ToSupervisors], 
           [Join1].[Organisation_Id], 
           [Join1].[Id3] 
       FROM [dbo].[Messages] AS [Extent1] 
         INNER JOIN (SELECT [Extent2].[Id]    AS [Id2], 
              [Extent2].[ToSupervisors] AS [ToSupervisors], 
              [Extent2].[Organisation_Id] AS [Organisation_Id], 
              [Extent3].[Id]    AS [Id3] 
            FROM [dbo].[Recipients] AS [Extent2] 
              LEFT OUTER JOIN [dbo].[MessageExtensions] AS [Extent3] 
              ON [Extent2].[Id] = [Extent3].[Recipients_Id]) AS [Join1] 
         ON [Extent1].[Recipients_Id] = [Join1].[Id2] 
       WHERE 11021 = [Extent1].[Id]) AS [Limit1] 
       LEFT OUTER JOIN (SELECT [Extent4].[Recipients_Id] AS [Recipients_Id1], 
             [Extent5].[Id]    AS [Id4], 
             [Extent5].[Name]   AS [Name], 
             [Extent5].[CreatedUtc]  AS [CreatedUtc1], 
             [Extent5].[Description]  AS [Description], 
             [Extent5].[Color]   AS [Color], 
             [Extent5].[Status]   AS [Status], 
             [Extent5].[Organisation_Id] AS [Organisation_Id], 
             [Join4].[Id5], 
             [Join4].[Recipients_Id2] 
           FROM [dbo].[RecipientsTeams] AS [Extent4] 
             INNER JOIN [dbo].[Teams] AS [Extent5] 
             ON [Extent4].[Team_Id] = [Extent5].[Id] 
             INNER JOIN (SELECT [Extent6].[Id]   AS [Id5], 
                  [Extent6].[Recipients_Id] AS [Recipients_Id2] 
                FROM [dbo].[Messages] AS [Extent6] 
                  LEFT OUTER JOIN [dbo].[MessageExtensions] AS [Extent7] 
                  ON [Extent6].[Recipients_Id] = [Extent7].[Recipients_Id]) AS [Join4] 
             ON [Extent4].[Recipients_Id] = [Join4].[Recipients_Id2]) AS [Join5] 
       ON [Limit1].[Id1] = [Join5].[Id5]) AS [Project1] 
ORDER BY [Project1].[Id] ASC, 
      [Project1].[Id1] ASC, 
      [Project1].[Id2] ASC, 
      [Project1].[C1] ASC 

Когда я запускаю эти запросы вручную, у меня есть s Результат. Для Where свойства, связанные с Team, все NULL, а для Single они заполнены.

Edit 2 Метод GetAll представляет собой метод Repository

public virtual IQueryable<T> GetAll() 
{ 
    return Context.Set<T>(); 
} 

где T является Message

+1

Этого не может быть. Вы посмотрели код sql, который поступает в базу данных? –

+0

Каков код в методе GetAll()? – Mardok

+0

Просьба предоставить [mcve] –

ответ

0

Можете ли вы попробовать это? var messages = GetAll(). Включить (m => m.Recipients.Teams). Где (m => m.Id == 123). Выберите (m => m);

+0

Без изменений - результат будет точно таким же. –

Смежные вопросы