LINQ《查詢運算式》與《Lambda 運算式》之 Left Join 使用

LINQ《查詢運算式》與《Lambda 運算式》之 Left Join 使用

假設我們的資料模型如下
    class PlayerViewModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int? TypeId { get; set; }
        public string TypeName { get; set; }

        public override string ToString()
        {
            return string.Format("Id={0}, Name={1}, TypeId={2}, TypeName={3}", this.Id, this.Name, this.TypeId, this.TypeName);
        }
    }

    class Player
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int TypeId { get; set; }
    }

    class TypeData
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
且當前資料為
            var typeList = new List<TypeData>
            {
                new TypeData { Id = 1, Name = "Type 1" },
                new TypeData { Id = 2, Name = "Type 2" }
            };

            var playerList = new List<Player>
            {
                new Player { Id = 1, Name = "A Player", TypeId = 0 },
                new Player { Id = 2, Name = "B Player", TypeId = 1 },
                new Player { Id = 3, Name = "C Player", TypeId = 2 },
            };
 使用 LINQ 查詢運算式
            var query = from p in playerList
                        join t in typeList on p.TypeId equals t.Id into tr
                        from t in tr.DefaultIfEmpty()
                        select new PlayerViewModel()
                        {
                            Id = p.Id,
                            Name = p.Name,
                            TypeId = p.TypeId,
                            TypeName = (t == null ? string.Empty : t.Name)
                        };

            foreach (var item in query)
            {
                Console.WriteLine(item);
            }

            Console.ReadLine();
印出結果如下 

使用 LINQ Lambda 運算式
            var query = playerList.GroupJoin(typeList,
                p => p.TypeId,
                t => t.Id,
                (p, t) => t.Select(tr => new PlayerViewModel()
                {
                    Id = p.Id,
                    Name = p.Name,
                    TypeId = p.TypeId,
                    TypeName = tr.Name
                }).DefaultIfEmpty(new PlayerViewModel()
                {
                    Id = p.Id,
                    Name = p.Name,
                    TypeId = p.TypeId,
                    TypeName = string.Empty
                })
                ).SelectMany(g => g);
印出結果同上

 參考資料

http://stackoverflow.com/questions/12075905/left-outer-join-in-lambda-method-syntax-in-linq