まず第一に、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);
}
2 つの 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 ファイルに何を追加する必要がありますか?
- より良いアプローチはありますか?