1

まず第一に、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(??)

私の質問は次のとおりです。

  1. 正しい (LINQ??) 選択構文は何ですか?
  2. 結合されたオブジェクトなので、何を返す必要がありますか? または、ProjectNumberResultView.cshtml ファイルに何を追加する必要がありますか?
  3. より良いアプローチはありますか?
4

3 に答える 3

1

LINQ クエリを次のように射影できますIEnumerable<ProjectNumberSearchResult>

var results = projects
    .Join(
        units,
        project => project.ProjectNumber,
        unit => unit.ProjectNumber,
        (project, unit) => new ProjectNumberSearchResult
        {
            ProjectNumber = project.ProjectNumber,
            UnitId = unit.UnitId,
            // you can populate any other properties from
            // the view model that you need
        })
    .ToList();

もちろん、あなたのビューはビューモデルに強く型付けされます:

@model IEnumerable<ProjectNumberSearchResult>
于 2016-01-08T09:04:34.583 に答える