2016-05-09 8 views
0

に基づいてすべてのレコードをカウントするために、私はこれを持っている:ループは、パラメータ

foreach(var item in db.AInfoes) 
{ 
    if (db.MRecords.Any(s => s.AID == item.ID)) 
    { 
     ViewBag.RecordExists = true; 
    } 
    else if(!db.MRecords.Any(s => s.AID == item.ID)) 
    { 
     ViewBag.NoRecordExists = true; 
    } 

} 

これの目的は、私の.cshtml Indexビュー内のリンクを非表示にすることです。 AInfoesテーブルをループし、外部キーAIDに一致するテーブル内のレコードが存在するかどうかを、プライマリキーIDと一致するかどうか確認します。デフォルトインデックスビューで次に

は、各レコードのEditDetailsDeleteリンクがあります。 ViewBag.NoRecordExists = trueの場合、表示するのはEditのリンクのみです。これがないため任意のMRecords場合にID

マイCSHTML:

@if (!ViewBag.RecordExists) 
{ 
    @Html.ActionLink("Edit Maintenance Record", "Edit", "MaintenanceRecords", new { id = item.ID }) 
} 
@if (ViewBag.NoRecordExists == true) 
{ 
    @Html.ActionLink("Edit Maintenance Record", "Edit", "MaintenanceRecords", new { id = item.ID }) 
} 
私はわざと IDが10に等しいすべての MRecordsを削除することによってこれをテストして、私の A&Mレコードデシベルで

..しかし、私が行ったとき私のインデックスビューは、リンクはすべてのレコードのためにそこにあった..再び私は0があるレコードのためのリンクを表示したい0 MRecords

助けていただければ幸いです。

答えて

2

あなたのクエリは非常に非効率的です。代わりに、可能なすべてのAInfoes IDを選択するだけで、が最初にと一致し、一致するMRecordsがあるかどうかを問い合わせる必要があります。これはRecordExistsのちょうど反対であるため、

var aInfoesIds = db.AInfoes.Select(m => m.ID).ToList(); 
ViewBag.RecordExists = db.MRecords.Any(m => aInfoesIds.Contains(m.AID)); 

また、ViewBag.NoRecordExistsの必要は、ありません。あなたのビューでは:あなたが何かをしたい場合は

@{ var recordExists = ViewBag.RecordExists as bool? ?? false; } 

その後、ときにのみ記録はそれを否定し、存在しません:

@if (!recordExists) 
{ 
    ... 
+0

私はあなたが提案された変更を行いました。私の '.cshtml'に' @if(recordExists) { @ Html.ActionLink( "メンテナンスレコードの編集"、 "MRecords"、新しい{id = item.ID}) } 'ID'が10であるすべてのMRecordを意図的に削除しました。** AInfoes **のMy * Index * Viewは、そのレコードの* Edit *リンクのみを表示する必要があります。しかし、代わりに** AInfoes **テーブルのすべてのレコードのEditリンクを表示しています(たとえそれらがMRecordsを持っていても) –

+0

これは 'ViewBag.RecordExists'がnullに評価されている可能性があります。単純にブールにキャストすることはできません(ブール型以外に設定されています)。どちらの場合でも、ビュー内のそのコード行はフォールバックとして 'false'と評価されます。 –

+0

'var aInfoesIds = db.AInfoes.Select(x => x.ID).ToList();' 5つの値 '6,7,8,9,10 'を保持します。' ViewBag.RecordExists = db.MRecords.Any (x => aInfoesIds.Contains(x.AID)); '10の' MRecords'がない場合でもtrueと評価されます。 –

関連する問題