首先,我是 DB First、MVC4、Entity Framework 5 尤其是 LINQ 的新手。
假设我们有一个包含以下表格的数据库:
T_Project
- string ProjectNumber (PK)
T_NetworkIpAddress
- string IP (PK)
- …some more attributes…
T_Unit
- Int UnitId (PK)
- string ProjectNumber (FK)
- string IpAddress (FK)
- … some more attributes…
T_ProjectAndIpIntersection
- string ProjectNumber (PK,FK)
- string IpAddress (PK,FK)
现在我们要创建一个ProjectNumberResultView
可以搜索ProjectNumber
. 结果应显示ProjectNumber
包含给定searchString
数据和其他表中的一些附加数据的每个数据。
我的解决方案是创建一个新的 ViewModel 类:
public class ProjectNumberSearchResult
{
public ProjectNumberSearchResult () {}
public string ProjectNumber { get; set; }
public string UnitId { get; set; }
public string IpAddress { get; set; }
}
我为我写了这个方法SearchController
:
public ActionResult ProjectNumberResultView(string searchString)
{
ViewBag.InputSearchString = searchString;
List<ProjectNumberSearchResult> results = new List<ProjectNumberSearchResult<>();
if (!String.IsNullOrEmpty(searchString))
{
searchString = searchString.Trim();
//find projects
var projects = from p in db.T_ProjectNumber
select p;
projects = projects.Where(s => s.ProjectNumber.Contains(searchString));
var units = from u in db.T_Unit
select u;
foreach (var p in projects.ToList())
{
var pUnits = units.Where(u => u.ProjectNumber.Equals(p.ProjectNumber));
//add only project number when there are no unit entries
if (pUnits.Count() == 0)
results.Add(new ProjectNumberSearchResult () { ProjectNumber = p.ProjectNumber });
//else add object with additional unit data for every unit entry
foreach (var unit in pUnits)
{
var result = new ProjectNumberSearchResult();
result.ProjectNumber = p.ProjectNumber;
result.UnitId = unit.UnitId;
result.IpAddress = unit.IpAddress;
results.Add(result);
}
}
}
return View(results);
}
我讨厌这个解决方案,因为我必须使用两次 foreach 迭代……我肯定更喜欢加入解决方案,但我无法解决。
我试过这样的事情:
var projects = from p in db.T_ProjectNumber
select p;
projects = projects.Where(s => s.ProjectNumber.Contains(searchString));
var units = from u in db.T_Unit
select u;
//find all projects with or without (there are project number without units) units incl. their additional data
var results = projects.Join(units,
pNumber => pNumber.ProjectNumber,
unitPNumber => unitPNumber.ProjectNumber,
(pNumber, unitPNumber) => new { T_ProjectNumber = pNumber,
T_Unit = unitPNumber })//.Select(??)
//return View(??)
我的问题是:
- 什么是正确的(LINQ??)选择语法?
- 既然它是连接对象,我应该返回什么?或者我必须向我的 ProjectNumberResultView.cshtml 文件添加什么?
- 有没有更好的方法?