2016-03-26 5 views
0

Как написать Description от Recipe в recipe=. Я попытался использовать join r in Recipe on d.DishID equals r.DishID, но он дал неправильный результат. Он стирает один элемент в результате1.Linq group join

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

. отношение от Dish => Рецепт 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

Вы должны добавить 'from r в recipes.DefaultIfEmpty () ', чтобы снова сгладить рецепты. Затем 'recipe = r? .Description'. –

+0

@GertArnold Обычно ответьте на C# 5, если я не уверен, что человек может использовать C# 6 – konkked

+1

Конечно, давайте укажем правое (imo) направление. –

Смежные вопросы