2016-06-16 6 views
0

viewmodelを使用して2つのテーブル(EtaとVoyage)のデータを表示していますが、私はviewmodelの名前を 'EtaVoyage'として使用しています。このクエリを使用すると、 追加情報:オブジェクト参照がオブジェクトのインスタンスに設定されていません。オブジェクト参照がmvc5で設定されていません

var Test = db.Etas.AsEnumerable().Select(v => new EtaVoyage() 
     { 
      ShippingAgent = v.ShippingAgent, 
      VesselInformation = v.VesselInformation, 
      Port = v.Port, 
      CPort = v.CPort, 
      EtaDate = v.EtaDate, 
      GoodsCarried = v.VoyageDetails.FirstOrDefault().GoodsCarried, 
      VoyagePurpose = v.VoyageDetails.FirstOrDefault().VoyagePurpose 
     }).ToList(); 
     return View(Test); 

しかし、私はvoyagedetailsに関連した最後の2つのフィールドをコメントしたときに、それが正常に働いています。

var Test = db.Etas.AsEnumerable().Select(v => new EtaVoyage() 
     { 
      ShippingAgent = v.ShippingAgent, 
      VesselInformation = v.VesselInformation, 
      Port = v.Port, 
      CustomPort = v.CustomPort, 
      EtaDate = v.EtaDate, 
      // GoodsCarried = v.VoyageDetails.FirstOrDefault().GoodsCarried, 
      // VoyagePurpose = v.VoyageDetails.FirstOrDefault().VoyagePurpose 
     }).ToList(); 
     return View(Test); 

この2つの列もインデックスページに表示する必要があります。

答えて

0

FirstOrDefault()nullを返すことがあります、

Enumerable.FirstOrDefault:戻り値

タイプ:ソースが空の場合TSOURCE デフォルト(TSOURCE)。そうでなければ、sourceの最初の要素。

使用

.Select(i=>i.GoodsCarried).FirstOrDefault() 

 .... 
     GoodsCarried = v.VoyageDetails.Select(i=>i.GoodsCarried).FirstOrDefault(), 
     VoyagePurpose = v.VoyageDetails.Select(i=>i.VoyagePurpose).FirstOrDefault() 
    }).ToList(); 
+0

今ではすべてのエラーを与えるdoesntの、しかし、2つのカラム(goodscarriedとvoyagepurpose:あなたのAsEnumerable()呼び出しは、単一のクエリにこれを最適化するから、LINQのツーSQLを停止しますが、私は、これは意図的であると仮定注意)が空です。 – user1543703

+0

'v.VoyageDetails'に含まれる内容を確認してください。外部キー参照テーブルの場合、参照されるコレクションにはマップされた行が含まれている必要があります。 –

0

コレクションv.VoyageDetailsは、任意の項目を含めることはできませんので、まずOrDefaultがデフォルト(参照型の場合はnull)を返しています。この特別なケースは別に扱うこともできますし、コレクションをフラット化するだけなので、null条件付き演算子を使用して、FirstOrDefaultがnullを返すときにGoodsCarriedVoyagePurposeをnullに設定することができます。

  • v.VoyageDetails自体があなたのクラスが初期化され、データがロードされている方法に応じて、nullである:

    GoodsCarried = v.VoyageDetails.FirstOrDefault()?.GoodsCarried, 
    VoyagePurpose = v.VoyageDetails.FirstOrDefault()?.VoyagePurpose 
    

    注することも可能です。これが予想される場合は、このケースも処理する必要があります。ここでも、ヌル条件演算子と:

    GoodsCarried = v.VoyageDetails?.FirstOrDefault()?.GoodsCarried, 
    VoyagePurpose = v.VoyageDetails?.FirstOrDefault()?.VoyagePurpose 
    
  • あなたは、このようなEntity Frameworkの、VoyageDetailsコレクションとしてORMを使用している場合は、それは単にあなたのためのデータを取得できない場合があり、熱心にロードされません。これが当てはまる場合は、コレクション内のデータを明示的にロードする必要があります。 Entity Frameworkでは、これはInclude呼び出しで行われます。

    db.Etas.Include(x => x.VoyageDetails).AsEnumerable().Select(...) 
    
関連する問題