linq联合查询(有null)
#region 定义类型 /// <summary> /// 专辑信息 /// </summary> public class Album { /// <summary> /// 专辑名称 /// </summary> public string Title { get; set; } /// <summary> /// 发行年份 /// </summary> public int Year { get; set; } /// <summary> /// 专辑描述 /// </summary> public string Description { get; set; } } /// <summary> /// 曲目信息 /// </summary> public class Track { /// <summary> /// 曲目名称 /// </summary> public string Name { get; set; } /// <summary> /// 艺术家名字 /// </summary> public string Artist { get; set; } /// <summary> /// 所属专辑 /// </summary> public Album AlbumOf { get; set; } } #endregion class Program { static void Main(string[] args) { // 专辑列表 Album album1 = new Album { Title = "专辑 1", Year = 2003, Description = "这是第一张专辑。" }; Album album2 = new Album { Title = "专辑 2", Year = 2009, Description = "这是第二张专辑。" }; List<Album> albums = new List<Album> { album1, album2 }; // 曲目列表 Track track1 = new Track { Name = "曲目 1", Artist = "艺术家 1", AlbumOf = album1 }; Track track2 = new Track { Name = "曲目 2", Artist = "艺术家 2", AlbumOf = album2 }; Track track3 = new Track { Name = "曲目 3", Artist = "艺术家 3", AlbumOf = album2 }; Track track4 = new Track { Name = "曲目 4", Artist = "艺术家 4", AlbumOf = album1 }; Track track5 = new Track { Name = "曲目 5", Artist = "艺术家 5", AlbumOf = album2 }; Track track6 = new Track { Name = "曲目 6", Artist = "艺术家 6", AlbumOf = null }; List<Track> tracks = new List<Track> { track1, track2, track3, track4, track5, track6 }; // 开始查询 var res1 = from t in tracks join a in albums on t.AlbumOf equals a into g1 // 没有 DefaultIfEmpty的话 曲目 6 检索不出来 from a1 in g1.DefaultIfEmpty() select new { TrackName = t.Name, Artist = t.Artist, AlbumName = a1 == null ? "未知专辑" : a1.Title }; // 以下代码会发生异常 //var res1 = from t in tracks // join a in albums on t.AlbumOf equals a into g1 // from a1 in g1.DefaultIfEmpty() // select new // { // TrackName = t.Name, // Artist = t.Artist, // AlbumName = a1.Title // }; // 输出结果 foreach (var item in res1) { Console.WriteLine("曲目:{0},艺术家:{1},专辑:{2}", item.TrackName, item.Artist, item.AlbumName); } Console.WriteLine(); var res2 = from t in tracks join a in albums on t.AlbumOf equals a into g from a2 in g.DefaultIfEmpty(new Album { Title = "<未知>", Year = 0, Description = "<无>" }) select new { TrackName = t.Name, Year = a2.Year, Artist = t.Artist, AlbumName = a2.Title, AlbumDesc = a2.Description }; // 输出结果 foreach (var item in res2) { Console.WriteLine("曲目:{0},年份:{1},艺术家:{2},专辑:{3},专辑描述:{4}", item.TrackName, item.Year, item.Artist, item.AlbumName, item.AlbumDesc); } Console.Read(); } }