2016-04-21 79 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

没有变化 - 结果完全一样。 –