2016-04-21 77 views
1

我的應用程序可用於將消息發送給包含用戶組的單個用戶和團隊的組合。結構是這樣的,一個Message實體具有一個Recipients實體,該實體又有一個User實體的列表和一個Team實體的列表。實體框架包括爲Single和Where返回不同​​的值

我試圖讓使用EF代碼第一次和LINQ到實體Message實體的名單,我想包括RecipientsTeams避免以後大量延遲加載請求。

奇怪的是,如果我使用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(從實體框架探查取)

Where語句

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 

當我運行這些查詢我手上有我的結果。對於WhereTeam相關屬性全部爲NULL,而對於Single,它們已填充。

編輯2GetAll方法是一個倉庫方法

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

其中TMessage

+1

它不可能。你看看數據庫中的sql代碼嗎? –

+0

GetAll()方法中的代碼是什麼? – Mardok

+0

請提供[mcve] –

回答

0

你能試試嗎?包含(m => m.Recipients.Teams).Where(m => m.Id == 123).Select(m => m);

+0

沒有變化 - 結果完全一樣。 –