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