LINQ - 在EF4中使用POCO与LinqToEntities进行左连接

时间:2011-03-15 13:41:49

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

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

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

  

选择g.Id,g.Title,p.Platform_short   来自游戏g   左外连接平台为p on g.PlatformId = p.Id

但是当我尝试将T-SQL翻译成LINQ时,用这个:

我得到的问题是平台== 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,                                 
                         });

Heres是整个方法:

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中的一对一关系。

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

1 个答案:

答案 0 :(得分:0)

当结果没有来自连接的enity set的任何内容时,你的左连接的目的是什么?

试试这个:

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。