2016-03-26 6 views
0

書き込み方法DescriptionRecipeからrecipe=までです。 join r in Recipe on d.DishID equals r.DishIDを使ってみましたが、間違った結果が出ました。 result1の項目を1つ消去します。Linqグループ参加

Exptected出力:

enter image description hereあなたは左をしたい

namespace ConsoleApplication3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<Component> Component = new List<Component>(); 
      List<Dish> Dish = new List<Dish>(); 
      List<Recipe> Recipe = new List<Recipe>(); 
      Dish.Add(new Dish { DishID = 9, CategoryID = 6, DishName = "Pork" }); 
      Dish.Add(new Dish { DishID = 10, CategoryID = 6, DishName = "Beef" }); 
      Component.Add(new Component { ComponentID = 1, DishID = 9, AmountID = "1", NameID = "1" }); 
      Recipe.Add(new Recipe { DishID = 9, RecipeID = 0, Description = "Test" }); 

      var result1 = (
      from d in Dish 
      //join r in Recipe on d.DishID equals r.DishID 
      join c in Component on d.DishID equals c.DishID into items 
      select new Item { DishID = d.DishID, components = items.ToList() recipe=} 
      ).ToList(); 
     } 
    } 
    public class Item 
    { 
     public int DishID { get; set; } 

     public string DishName { get; set; } 

     public string recipe { get; set; } 

     public List<Component> components { get; set; } 
    } 

    public partial class Component 
    { 
     public int ComponentID { get; set; } 
     public int DishID { get; set; } 
     public string AmountID { get; set; } 
     public string NameID { get; set; } 
    } 

    public partial class Dish 
    { 
     public int DishID { get; set; } 
     public int CategoryID { get; set; } 
     public string DishName { get; set; } 
    } 
    public partial class Recipe 
    { 
     public int RecipeID { get; set; } 
     public int DishID { get; set; } 
     public string Description { get; set; } 
    } 
} 
+0

「それは間違った結果をもたらします」とは何ですか?サンプル入力?期待される出力? – Eser

+0

あなたのコードを実行するように修正してください、今はあなたが言っていたものではなく、linqで左結合を行う方法についての答えを出しましたが、あなたのコードはコンパイルされず、現在働いているコードを表示します – konkked

+0

調理法=>レシピ1から1への関係?あなたの編集は私を混乱させました – konkked

答えて

2

はあなたがわからない、LINQでいくつかの余分なものを行う必要があるこれを行うには

に参加し、なぜそれをイマイチネイティブにサポートしますが、それはありません。

 var result1 = (
     from d in Dish 
     join c in Component on d.DishID equals c.DishID into items 
     join r in Recipe on d.DishID equals r.DishID into recipes 
     select new Item { 

        DishID = d.DishID, 

        components = items.DefaultIfEmpty() 
             .Where(a=>a!=null) 
             .ToArray(), 

        recipe = recipes.DefaultIfEmpty() 
            .Where(a=>a!=null) 
            .Select(a=>a.Description) 
            .FirstOrDefault() 
     }).ToList(); 
+1

'r from recipes.DefaultIfEmpty ) 'を押してレシピを再度平坦化します。その後、 'recipe = r?.Description'となります。 –

+0

@ GertArnold通常、C#6を使用できると確信していない限り、C#5で応答します。 – konkked

+1

確かに、右(imo)方向を示すだけです。 –