2010-06-04 75 views
3

我已经看到了很多这方面的例子,但在这个例子中重新产生它们似乎并不奏效。没有人有任何的想法有什么不对下面的代码....Linq Left加入问题

var products = new[] 
    { 
     new {ProductName ="Soda", Category = "Beverages"}, 
     new {ProductName ="Tuna", Category = "SeaFood"}, 
     new {ProductName ="Jam", Category = "Condiment"} 
    }; 

    var categories = new[] 
    { 
     new {Category = "Beverages", Description="Slurp"}, 
     new {Category = "SeaFood" , Description="Nosh"}, 
     new {Category = "Exotic" , Description="Spicy!"}, 
    }; 

    var q = from c in categories 
       join p in products on c.Category equals p.Category into tmp 
       from prd in tmp.DefaultIfEmpty() 
       select new { Category = c.Category, 
           Description = c.Description,   
           ProductName = prd.ProductName }; 

许多在此先感谢

基思

回答

1

的问题是,没有在类别没有产品“舶来” ,因此在尝试读取产品名称时(在最后一行代码行中)会引发NullReferenceException

的代码不崩溃,你可以添加一个空检查:

var q = from c in categories 
     join p in products on c.Category equals p.Category into tmp 
     from prd in tmp.DefaultIfEmpty() 
     select new 
     { 
      Category = c.Category, 
      Description = c.Description, 
      ProductName = prd != null ? prd.ProductName : "[null]" 
     };