2017-10-24 13 views
0

私はList<Ingridient>からの頼まれingridientsを持っているすべての料理を取得したいのですが、データベースモデルLinqクエリの2リストを比較する方法?

public class Dish 
    { 
     public int Id { get; set; } 
     public String Name { get; set; } 
     public Dictionary<Ingridient, int> Ingridients { get; set; } 
     public List<String> Images { get; set; } 
     public String Guide { get; set; } 
     public Guid User { get; set; } 
     public DishType dishType { get; set; } 
     public int Rate { get; set; } 

     public enum DishType 
     { 
      Polish, 
      Asian, 
      Indian, 
      Other 
     }; 
    } 

を持っています。

入力List<Ingridient>

のような何かが辞書が、これらすべてのingridientsをcontaintsすべての料理を取得します。 Ingridientが鍵です。

私はデータベースからすべての料理を扱ういくつかの遅い解決策を試しましたが、私はデータベースをより速くするためにクエリデータベースに移動したいと思います。

マイソリューション - 非常に遅く、大量のメモリをとります

List<Dish> allDishes = Dishes.Select(n => n).ToList(); 
      List<Dish> Found = new List<Dish>(); 
      foreach(var d in allDishes) 
      { 
       List<Ingridient> fromDish = d.Ingridients.Keys.ToList(); 

       foreach(var ing in ingridients) 
       { 
        if (!fromDish.Contains(ing)) 
         break; 
       } 

       Found.Add(d); 
      } 

私は、LINQクエリとして、この動作を再現したいと思います。

+2

これまでに何を試しましたか? –

+0

解決策を探してみましたが、まだ役に立たないものは見つかりませんでした。私は自分自身のLinqを考え出そうとしましたが、正直言って私にとっては複雑すぎます。 – Dreik

+0

質問を編集しました。欠けているものや何かが間違っている場合は、それを修正する際にあなたの助けに感謝したいと思います。 – Dreik

答えて

1

は、要求リスト中の全ての成分が皿の成分に含まれている!ingredients.Except(dish.Ingredients).Any()チェック

dishes.Where(dish => !ingredients.Except(dish.Ingredients).Any()).ToList(); 

を試してみてください。

テストでフィドルを試すことができますhere

+0

ありがとう、私は自分のlinqのカップルを試してみましたが、私は結果を得ることができませんでした。また、私は 'var foundDishes = Dishes.Where(dish => dish.Ingridients.Keys.ToList()。Exists(ingridients.Contains(ing)))で間違ったことを知りません。 ' – Dreik

関連する問題