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 Schools
和Contacts
。我正在尝试使用 LINQ 查询将两个模型连接在一起并将其分配到名为 SchoolVM
.
的 ViewModel 中
我通过 school.ID equals contact.School_ID
加入了 Contacts
和 Schools
所以对于 Schools
中的记录 id = 1
,它确实 return 我想要的结果。
但是当我重新查询 id = 2
或 id = 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 的学校没有联系人,您将无法取回这些记录。您需要改为进行左连接。
好的。我将尽我最大的能力描述我想要完成的事情。我找不到任何提出我问题的 Stack Overflow 问题。
ASP.NET MVC5 - (Entity Framework) 从 DBContext 模型到 ViewModel 的 LINQ 查询
我正在使用 ASP.NET MVC5 和 Entity Framework 并且我已经将 DBContext 搭建到 class models Schools
和Contacts
。我正在尝试使用 LINQ 查询将两个模型连接在一起并将其分配到名为 SchoolVM
.
我通过 school.ID equals contact.School_ID
Contacts
和 Schools
所以对于 Schools
中的记录 id = 1
,它确实 return 我想要的结果。
但是当我重新查询 id = 2
或 id = 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 的学校没有联系人,您将无法取回这些记录。您需要改为进行左连接。