【问题标题】:LINQ - Left join with LinqToEntities using POCO in EF4LINQ - 在 EF4 中使用 POCO 与 LinqToEntities 左连接
【发布时间】:2011-03-15 13:41:49
【问题描述】:

我的 JOIN 遇到了很多麻烦,我不知道它是依赖于 EDM 还是只是 LINQ 查询。

当我在 SSMS 中尝试这个 T-SQL 时,它就像一个魅力:

选择 g.Id、g.Title、p.Platform_short 从游戏作为g left outer join Platforms as p on g.PlatformId = p.Id

但是当我尝试将 T-SQL 转换为 LINQ 时,使用:

我得到的问题是 Platform == null

我尝试了不同的方法,但我得到了重复。

我已经被这个问题困扰了几天,而且我是 EF 的新手。

var games = (from g in ctx.Games
                         join p in ctx.Platforms
                         on g.Platform.Id equals p.Id
                         select new 
                         {
                             Id = g.Id,
                             Title = g.Title,
                             Platform = g.Platform,                                 
                         });

这是整个方法:

public ICollection<Game> GetGames()
    {            
        using(xContext ctx = new xContext())
        {                
            ICollection<Game> col = new Collection<Game>();

            var games = (from g in ctx.Games
                         join p in ctx.Platforms
                         on g.Platform.Id equals p.Id
                         select new 
                         {
                             Id = g.Id,
                             Title = g.Title,
                             Platform = g.Platform,                                 
                         });

            foreach (var g in games)
            {
                Game game = new Game();
                game.Id = g.Id;
                game.Title = g.Title;
                game.Platform = g.Platform;                    
                col.Add(game);
            }

            return col;

        }
    }

我的 GamePoco 具有平台属性,并且在 EDM 中是一对一的关系。

希望任何人都可以提供帮助!

【问题讨论】:

    标签: .net linq entity-framework-4 linq-to-entities poco


    【解决方案1】:

    当结果没有来自连接实体集的任何内容时,左连接的目的是什么?

    试试这个:

    var games = (from g in ctx.Games
                 join p in ctx.Platforms
                 on g.Platform.Id equals p.Id into joinTable
                 from j in jointTable.DefaultIfEmpty()
                 select new 
                 {
                     Id = g.Id,
                     Title = g.Title,
                     Platform = j.PlatformShort                                 
                 });
    

    这仅适用于 EFv4。

    【讨论】:

    • 感谢您的回答,我认为它有效,是否可以获得整个 Platform obj 而不仅仅是 Platform_short ? Platform 是 Game obj 中的子类。
    • 尝试将j 分配给Platform
    • 我也试过“选择新游戏 { .. } 但我收到此错误“无法在 LINQ to Entities 查询中构造实体或复杂类型 'xModel.Game'。”
    猜你喜欢
    • 2010-10-06
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    相关资源
    最近更新 更多