ASP.NET MVC 5 - (Entity Framework) LINQ Query Join 和 Where 仅返回 1 个结果但不返回其他结果(如果更改)

ASP.NET MVC5 - (Entity Framework) LINQ Query Join & Where returning only 1 result but not other result if changed

好的。我将尽我最大的能力描述我想要完成的事情。我找不到任何提出我问题的 Stack Overflow 问题。

ASP.NET MVC5 - (Entity Framework) 从 DBContext 模型到 ViewModel 的 LINQ 查询

我正在使用 ASP.NET MVC5 和 Entity Framework 并且我已经将 DBContext 搭建到 class models SchoolsContacts。我正在尝试使用 LINQ 查询将两个模型连接在一起并将其分配到名为 SchoolVM.

ViewModel

我通过 school.ID equals contact.School_ID

加入了 ContactsSchools

所以对于 Schools 中的记录 id = 1,它确实 return 我想要的结果。

但是当我重新查询 id = 2id = 3 等等时,它 return 什么都没有,计数为零。

告诉大家,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);
}

更新:

感谢 Daniel Lorenz 的投入。非常简单的解决方案。我刚刚将 LINQ 查询从 INNER JOIN 或 JOIN 更改为 LEFT JOIN。

原版:

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();

解决方案:

//**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();

您正在内部加入联系。因此,如果 ID 为 2、3 的学校没有联系人,您将无法取回这些记录。您需要改为进行左连接。