2016-12-08 6 views
1

Web ApiコントローラのエンティティフレームワークコードファーストとLINQ to Entitiesを使用しています。 (次のようにモデルクラスである)LINQの代わりにナビゲーションプロパティを使用WebApiコントローラでの結合

私の予約クラス:

[Table("Reservations")] 
public class Reservation 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ReservationId { get; set; } 
    public DateTime Date { get; set; } 

    public int RoomId { get; set; } 
    public Room Room { get; set; } 



    public Customer Customer { get; set; } 
    public int CustomerId { get; set; } 

    // create association table ReservationMeals 
    public virtual ICollection<ReservationMealItems> ReservationMeals { get; set; } 
} 

協会クラス:

public class ReservationMealItems 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public int ReservationId { get; set; } 

    public int MealId { get; set; } 


    public virtual Reservation Reservation { get; set; } 
    public virtual Meal Meal { get; set; } 

} 

は、私は次の関係/ナビゲーションプロパティと関連している3つのテーブルを持っています

食事クラス:

[Table("Meals")] 
public class Meal 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string ImageUrl { get; set; } 
    public int MealTypeId { get; set; } 


    public virtual MealType Type { get; set; } 

    public virtual ICollection<MenuMealItem> Menus { get; set; } 

    // create association table ReservationMeal 
    public virtual ICollection<ReservationMealItems> ReservationMeals { get; set; } 

    // one-to-one with MealPrice where MealPrice is the dependant 
    public virtual MealPrice MealPrice { get; set; } 
} 

そしてここに、私はDateを渡してから、その特定の日付に行われたすべての予約からすべての食事を取り戻すためにテーブルを照会するコントローラがあります。

 public IHttpActionResult GetReservationMealsForDate(DateDto date) 
    { 
     using (var context = new CafeteriaContext()) 
     { 
      var reservationMeals = from p in context.Reservations 
            where p.Date == date.Date 
            join d in context.ReservationMeals 
            on p.ReservationId equals d.ReservationId 
            select new SimpleId 
            { 
             Id = d.MealId 
            }; 


      var meals = from p in context.Meals 
         join d in reservationMeals 
         on p.Id equals d.Id 
         select new SimpleMeal 
         { 
          Name = p.Name 
         }; 


      return Ok(meals.ToList()); 
     } 
    } 

コントローラは動作し、その日に行われたすべての予約から食事リストを取り戻しますが、それは最適ではないと確信しています。

私はJOINを使用せず、代わりにナビゲーションプロパティを使用しましたが、成功しませんでした。リレーションシップが正しく設定されているかどうか、そしてナビゲーションプロパティが必要なときに配置されている場合は、コントローラがナビゲーションプロパティを使用して同じ結果セットを戻すためにどのように書き直すことができるのでしょうか。

のクエリをLINQメソッドの構文を使用して書く方法を知りたいと思います。そのように書くことに成功しなかったためです。

私は現在学習しており、説明は非常に高く評価されています。私はこのブログ投稿Coding Abelを読んで、私はそれがうまくいくように管理しました。しかし、私はまだ自分の解決策が正しいことを知り、より良い選択肢を学ぶことを熱望しています。ありがとう!

答えて

2

LINQとメソッドIncludeを使って積極的に読み込めます。あなたがより多くの情報MSDN

クエリ構文

var z = (from resevationMealsItems in context.ReservationMealItems 
     join reservation in context.Reservation on resevationMealsItems.ReservationId equals 
     reservation.ReservationId 
     join meal in context.Meal on resevationMealsItems.MealId equals meal.Id 
     select meal.Name).ToList(); 
+0

以来見つける

ラムダ

ここ
var x = context.ReservationMealItems.Include(res => res.Reservation) .Where(dt => dt.Reservation.Date == DateTime.Now) .ThenInclude(meal => meal.Meal) .Select(d => d.Meal.Name) .ToList(); 

:あなたのテーブルReservationMealItemsは以下のように、あなたのエンティティを含む必要がある。この場合、食事や予約に関係を持っていますクエリは投影を使用しますが、熱心な読み込みとは何の共通点もありません。あなたが書いたクエリは 'Include'呼び出しなしで動作します(とにかく無視されます)。 –

+0

それで、それを認識しないので、2番目の 'Include'を追加できないようです。なぜ私は正確にわからない。たぶん、 'virtual'としてマークされているプロパティのため、私はよく分かりません。しかし、私は、遅延ロードを利用して次のクエリを実行して結果を得ています: 'var betterAlt = context.ReservationMeals.Where(dt => dt.Reservation.Date == date.Date).Select(d => d.Meal.Name ).ToList(); ' –

+0

あなたの答えは間違いなく正しい方向で私を指摘しています。なぜ私が最初に予約テーブルをターゲットにしてから他の人に行ったのかを知りました。 navプロパティと最初のTargetingMealテーブルを使用すると、物事はより短くより直接的になります。MSDNのリンクをありがとう、それは私が必要としていたものです。 Lazy Loadingは危険で非常に有害であると思われるので、私は熱心な負荷をさらに活用しようとします。もう一つのポイントは、 'Include'メソッドは、私たちが含めるnav propの名前を指す文字列だけを取るように思われる点です。 –

関連する問題