2017-09-20 17 views
0

私が達成しようとしていることを、自分の能力のうち最高のものについて説明します。私は私の質問をもたらすスタックオーバーフローの質問を見つけることができませんでした。ASP.NET MVC5 - (Entity Framework)LINQクエリ結合&変更された場合は1つのみの結果を返しますが、他の結果は返しません。

ASP.NETのMVC5 - (Entity Frameworkの)LINQクエリDBContextモデルからのViewModel

私は、Entity Frameworkを使用してASP.NET MVC5を使用していると私はモデルSchoolsクラスにDBContextをスキャフォールドしてきたし、 Contacts。私はLINQクエリを使用して2つのモデルを一緒に結合し、ViewModelSchoolVMという名前に割り当てようとしています。

私はSchoolsのレコードid = 1のために、それは私が望んでいた結果を返しませんので、school.ID equals contact.School_ID

を通じてSchoolsContactsに参加しました。

しかし、id = 2またはid = 3などのために再クエリすると、何も返されず、カウントがゼロになります。

誰もが知っているように、id 2,3,4などのレコードは存在します。

誰でも私にこれを手伝ってもらえますか?より多くのコード情報が必要な場合はお知らせください。

ここではコントローラの動作方法を以下に示します。

public ActionResult Details(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 

    //**LINQ Query joining two Models and putting into a ViewModel. 
    //**LINQ Query that seems to return the record ID == 1, but not 
    //**existing record ID == 2 or 3 or so on and so forth. 
    var schoolDetails = (from school in db.Schools 
         join contact in db.Contacts on school.ID equals contact.School_ID 
         where school.ID == id 
         select new { school, contact }).ToList(); 

    //**This is the ViewModel that I am trying to assign the joined LINQ query into. 
    SchoolVM schoolVM = new SchoolVM(); 

    foreach (var value in schoolDetails) 
    { 

     //**Schools Model Information 
     schoolVM.ID = value.school.ID; 
     schoolVM.SchoolName = value.school.SchoolName; 
     schoolVM.Address = value.school.Address; 
     schoolVM.City = value.school.City; 
     schoolVM.State = value.school.State; 
     schoolVM.Zip = value.school.Zip; 
     schoolVM.MainPhone = String.IsNullOrEmpty(value.school.MainPhone) ? "" : String.Format("{0:(###) ###-####}", double.Parse(value.school.MainPhone)); 
     schoolVM.Website = value.school.Website; 
     schoolVM.NumberOfStudents = value.school.NumberOfStudents; 
     schoolVM.SchoolOrDistrict = value.school.SchoolOrDistrict; 
     schoolVM.CountyID = value.school.CountyID; 

     //**Contacts Model Information 
     schoolVM.ContactFirstName = value.contact.ContactFirstName; 
     schoolVM.ContactLastName = value.contact.ContactLastName; 
     schoolVM.ContactTitle = value.contact.ContactTitle; 
     schoolVM.ContactPhone = value.contact.ContactPhone; 
     schoolVM.ContactEmail = value.contact.ContactEmail; 
     schoolVM.PrimaryOrSecondary = value.contact.PrimaryOrSecondary; 
     schoolVM.Coordinator = value.contact.Coordinator; 
    } 

    //**This is where LINQ is returning COUNT = 0 for ID = 2, 3, 4 and so forth. 
    if (schoolDetails == null || schoolDetails.Count == 0) 
    { 
     return HttpNotFound(); 
    } 

    return View(schoolVM); 
} 

UPDATE:ダニエル・ローレンツの入力に

感謝。非常に簡単な解決策。 LINQクエリをINNER JOINまたはJOINからLEFT JOINに変更しました。

ORIGINAL:

var schoolDetails = (from school in db.Schools 
        join contact in db.Contacts on school.ID equals contact.School_ID 
        where school.ID == id 
        select new { school, contact }).ToList(); 

SOLUTION:

//**Changed alias name around a bit to accommodate the rest of the code. 

var schoolDetails = (from school in db.Schools 
        join contacts in db.Contacts on school.ID equals contacts.School_ID into schoolvm 
        from contact in schoolvm.DefaultIfEmpty() 
        where school.ID == id 
        select new { school, contact }).ToList(); 

答えて

2

連絡先に参加インナーです。したがって、Id 2、3の学校の連絡先がない場合は、その記録を取り戻すことはできません。代わりに左の結合を行う必要があります。

+0

Dang。私はそれを監督するとは信じられません。あなたの目を見ていただきありがとうございます。私はそれを私が得た解決策で更新します。 –

+1

私たちすべてに起こります。 :) –

関連する問題