Linq-to-entities - Include() method not loading

前端 未结 5 1243
既然无缘
既然无缘 2020-11-28 07:18

If I use a join, the Include() method is no longer working, eg:

from e in dc.Entities.Include(\"Properties\")
join i in dc.Items on e.ID equals i.Member.ID
w         


        
5条回答
  •  天涯浪人
    2020-11-28 07:49

    So, I realise I am late to the party here, however I thought I'd add my findings. This should really be a comment on Alex James's post, but as I don't have the reputation it'll have to go here.

    So my answer is: it doesn't seem to work at all as you would intend. Alex James gives two interesting solutions, however if you try them and check the SQL, it's horrible.

    The example I was working on is:

            var theRelease = from release in context.Releases
                             where release.Name == "Hello World"
                             select release;
    
            var allProductionVersions = from prodVer in context.ProductionVersions
                                        where prodVer.Status == 1
                                        select prodVer;
    
            var combined = (from release in theRelease
                            join p in allProductionVersions on release.Id equals p.ReleaseID
                            select release).Include(release => release.ProductionVersions);              
    
            var allProductionsForChosenRelease = combined.ToList();
    

    This follows the simpler of the two examples. Without the include it produces the perfectly respectable sql:

    SELECT 
        [Extent1].[Id] AS [Id], 
        [Extent1].[Name] AS [Name]
        FROM  [dbo].[Releases] AS [Extent1]
        INNER JOIN [dbo].[ProductionVersions] AS [Extent2] ON [Extent1].[Id] = [Extent2].[ReleaseID]
        WHERE ('Hello World' = [Extent1].[Name]) AND (1 = [Extent2].[Status])
    

    But with, OMG:

    SELECT 
    [Project1].[Id1] AS [Id], 
    [Project1].[Id] AS [Id1], 
    [Project1].[Name] AS [Name], 
    [Project1].[C1] AS [C1], 
    [Project1].[Id2] AS [Id2], 
    [Project1].[Status] AS [Status], 
    [Project1].[ReleaseID] AS [ReleaseID]
    FROM ( SELECT 
        [Extent1].[Id] AS [Id], 
        [Extent1].[Name] AS [Name], 
        [Extent2].[Id] AS [Id1], 
        [Extent3].[Id] AS [Id2], 
        [Extent3].[Status] AS [Status], 
        [Extent3].[ReleaseID] AS [ReleaseID],
        CASE WHEN ([Extent3].[Id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
        FROM   [dbo].[Releases] AS [Extent1]
        INNER JOIN [dbo].[ProductionVersions] AS [Extent2] ON [Extent1].[Id] = [Extent2].[ReleaseID]
        LEFT OUTER JOIN [dbo].[ProductionVersions] AS [Extent3] ON [Extent1].[Id] = [Extent3].[ReleaseID]
        WHERE ('Hello World' = [Extent1].[Name]) AND (1 = [Extent2].[Status])
    )  AS [Project1]
    ORDER BY [Project1].[Id1] ASC, [Project1].[Id] ASC, [Project1].[C1] ASC
    

    Total garbage. The key point to note here is the fact that it returns the outer joined version of the table which has not been limited by status=1.

    This results in the WRONG data being returned:

    Id  Id1 Name        C1  Id2 Status  ReleaseID
    2   1   Hello World 1   1   2       1
    2   1   Hello World 1   2   1       1
    

    Note that the status of 2 is being returned there, despite our restriction. It simply does not work. If I have gone wrong somewhere, I would be delighted to find out, as this is making a mockery of Linq. I love the idea, but the execution doesn't seem to be usable at the moment.


    Out of curiosity, I tried the LinqToSQL dbml rather than the LinqToEntities edmx that produced the mess above:

    SELECT [t0].[Id], [t0].[Name], [t2].[Id] AS [Id2], [t2].[Status], [t2].[ReleaseID], (
        SELECT COUNT(*)
        FROM [dbo].[ProductionVersions] AS [t3]
        WHERE [t3].[ReleaseID] = [t0].[Id]
        ) AS [value]
    FROM [dbo].[Releases] AS [t0]
    INNER JOIN [dbo].[ProductionVersions] AS [t1] ON [t0].[Id] = [t1].[ReleaseID]
    LEFT OUTER JOIN [dbo].[ProductionVersions] AS [t2] ON [t2].[ReleaseID] = [t0].[Id]
    WHERE ([t0].[Name] = @p0) AND ([t1].[Status] = @p1)
    ORDER BY [t0].[Id], [t1].[Id], [t2].[Id]
    

    Slightly more compact - weird count clause, but overall same total FAIL.

    Has anybody actually ever used this stuff in a real business application? I'm really starting to wonder... Please tell me I've missed something obvious, as I really want to like Linq!

提交回复
热议问题