2017-06-03 17 views
-2

私は、ユーザーが行った予約を表示できるビューを作成しようとしています。私は、異なる施設、ホール、部屋で2種類の予約のリストを保持するモデルを持っています。そのモデルには、ホール予約のリストとルーム予約のリストがあります。私のコントローラーでは、私はすべてのホールの予約をホールの予約リストに追加しようとしており、同じことはルームの予約に追加しようとしています。ここで c# - オブジェクト参照がオブジェクトのインスタンスに設定されていません - LINQ

public class AllBookingsViewModel 
{ 

    public List<HallActivityBooking> HallBookingsList { get; set; } 

    public List<RoomBooking> RoomBookingsList { get; set; } 

} 

は私のコントローラである:しかし、私はこのエラーここ

"Object reference not set to an instance of an object."

を取得していますが、私のモデルであり、ここで

public class BookingsController : BaseController 
{ 
    // GET: Bookings 
    public ActionResult Bookings() 
    { 

     //Get current user 
     var userId = User.Identity.GetUserId(); 
     var currentUser = db.Users.Find(userId); 

     AllBookingsViewModel model = new AllBookingsViewModel(); 

     //Fill activity booking 
     foreach (HallActivityBooking hallBooking in db.HallBookings.Where(x => x.CustomerUser.Id == currentUser.Id)) 
     { 
      model.HallBookingsList.Add(hallBooking); //<< This is where I get an exception 
     } 


     //Fill room bookings list 
     foreach (RoomBooking roomBooking in db.RoomBookings.Where(x => x.CustomerUser.Id == currentUser.Id)) 
     { 
      model.RoomBookingsList.Add(roomBooking); 
     } 

     return View(model); 
    } 

すると、これらは私のコードではもはやまだない(私が試したものです):

私はモデルのように宣言しようとしました:

var model = new AllBookingsViewModel 

私は、LINQのステートメントに "FirstOrDefault" を追加しようとしました:

foreach (HallActivityBooking hallBooking in db.HallBookings.Where(x => x.CustomerUser.Id == currentUser.Id).FirstOrDefault()) 
{ 
    model.HallBookingsList.Add(hallBooking); 
} 

これは私に、このエラーを与える:

Severity Code Description Project File Line Suppression State Error CS0446 Foreach cannot operate on a 'method group'. Did you intend to invoke the 'method group'? ... 26 Active

ヘルプは


をいただければ幸いです

SOL VED

にここでは、私はこの問題を解決するためにやったことです:ため、各

ザ・は必要ではなかった、私はちょうどそれを価値のLINQ文のを与えることによって、ビューモデルを初期化するために必要な:

 AllBookingsViewModel model = new AllBookingsViewModel(); 
     { 
      model.HallBookingsList = db.HallBookings.Where(x => x.CustomerUser.Id == currentUser.Id); 
      model.RoomBookingsList = db.RoomBookings.Where(x => x.CustomerUser.Id == currentUser.Id); 
     }; 
+0

それぞれの「HallBookings」レコードには、「CustomerUser」が関連付けられていますか?あなたが言及したエラーメッセージ、null参照例外から、私は、少なくとも1つの 'HallBookings'が' CustomerUser'としてnull参照を持っていると仮定することができます。 – Christos

+2

FirstOrDefaultは、Where句の条件に一致するオブジェクトを1つだけ返します。だからforeachを使うことはできません。ヌル参照エラーをもたらすコード行はどれですか? –

+0

'AllBookingsViewModel'のコレクションは初期化されていません。 – kiziu

答えて

1

あなたはあなたは直接使用し、これらのプロパティを設定するには、LINQの結果を使用することができ、プロパティ

AllBookingsViewModel model = new AllBookingsViewModel(); 
model.HallBookingsList = new List<HallActivityBooking>(); 
model.RoomBookingsList = new List<RoomBooking>(); 
//Your existing code 

を初期化する必要がありますか。

AllBookingsViewModel model = new AllBookingsViewModel(); 
model.HallBookingsList = db.HallBookings.Where(x => x.CustomerUser.Id == currentUser.Id); 
model.RoomBookingsList = db.RoomBookings.Where(x => x.CustomerUser.Id == currentUser.Id); 
+1

さて、私はそれを基本的に初期化する必要がありました。基本的にはforeachは不必要でしたが、ここでは私がしたことがあります: AllBookingsViewModelモデル= new AllBookingsViewModel(); { model.HallBookingsList = db.HallBookings.Where(x => x.CustomerUser.Id == currentUser.Id); model.RoomBookingsList = db.RoomBookings.Where(x => x.CustomerUser.Id == currentUser.Id); }; 問題が解決しました。ありがとうございました – GavinMac

0

ここでは、HallBookingsまたはRoomBookingsのいずれかがあり、nullにはCustomerUserが含まれている可能性があります。

したがって、LINQがWhere句で渡されたFuncを実行しているときに、nullのCustomerUserを持つエンティティの1つがエラーを引き起こします。

ビジネスロジックで許可されているかどうかわかりませんが、null参照を避ける場所で提供されているFuncでいくつかのヌルチェックを提供できます。

例:

//Fill activity booking 
foreach (HallActivityBooking hallBooking in db.HallBookings.Where(x => x.CustomerUser != null ? x.CustomerUser.Id == currentUser.Id : false)) 
{ 
    model.HallBookingsList.Add(hallBooking); 
} 
関連する問題