2014-06-09 29 views
0

我有一個ViewModel和我當前返回一個查詢,如果電影有僱員,他們有一個角色那麼該電影,演員和角色都是回。添加額外的查詢返回(查看)

現在我想添加一個額外的查詢,使string(或任何效果最好)的同一部電影中的所有員工。所以如果三個人在同一部電影中,我想要一個列表,以便我可以在我的視圖中調用它。

我當前的查詢/ 控制器

 var parameter = Int32.Parse(Filter); 
     var queryString = 
     from m in db.Movies 

     join me in db.MovieEmployees 
     on m.ID equals me.movieID 

     join e in db.Employees 
     on me.employeeID equals e.ID 

     join r in db.Roles 
     on me.roleID equals r.ID 

     where (parameter == 1 && m.Name.Contains(searchString)) || 
       (parameter == 2 && e.Name.Contains(searchString)) || 
       (parameter == 3 && r.RoleType.Contains(searchString)) 

     select new StarringViewModel { employeeID = e.ID, movieID = m.ID, roleID = r.ID, 
       movieName = m.Name, movieDescription = m.Description, 
       movieReleaseDate = m.ReleaseDate, employeeBirthdate = e.Birthday, 
       employeeName = e.Name, Role = r.RoleType }; 

      return View(queryString.Distinct().ToList().OrderBy(x => x.movieName)); 

而且它看起來像這樣

enter image description here 看我怎麼有「有史以來最偉大的電影」兩名員工,我想回到那個名單在我的電影下面有employeeList這個是我的Model,ViewModel和DB layo UT。

型號

public class StarringViewModel 
    { 
     public int movieID { get; set; } 
     public int roleID { get; set; } 
     public int employeeID { get; set; } 
     public string movieName { get; set; } 
     public string movieDescription { get; set; } 
     public DateTime? movieReleaseDate { get; set; } 
     public string Role { get; set; } 
     public string employeeName { get; set; } 
     public DateTime employeeBirthdate { get; set; } 
     public string employeeList { get; set; } // <-- I want this to be the list of actors in same movies 
    } 

查看

<table class="table table-striped table-hover table-responsive table-condensed"> 
     <tr> 
      <th> 
       <h3 style="font-size: x-large; font-weight: bolder">Movie Name</h3> 
      </th> 
      <th> 
       <h3 style="font-size: x-large; font-weight: bolder">Release Date</h3> 
      </th> 
      <th> 
       <h3 style="font-size: x-large; font-weight: bolder">Employee</h3> 
      </th> 
      <th> 
       <h3 style="font-size: x-large; font-weight: bolder">@Html.DisplayNameFor(model => model.Role)</h3> 
      </th> 
      <th> 
       @using (Html.BeginForm("Index", "Starring")) 
       { 
        <div class="dropdown"> 
         <select class="btn btn-group-lg btn-default col-md-4" style="margin-top: 15px; height: 36px; opacity: 1" data-toggle="dropdown" name="Filter"> 
          <option value="0" disabled selected>Filter By...</option> 
          <option value="1">Movie Name</option> 
          <option value="2">Actor Name</option> 
          <option value="3">Role</option> 
         </select> 
        </div> 

    <input type="text" name="searchString" class="col-md-6" style="margin-top: 16px; text-align:center; height:35px; font-size:20px" placeholder="enter text" /> 
    <button type="submit" class="btn btn-group-lg btn-primary col-md-2 glyphicon glyphicon-arrow-right" style="margin-top: 15px; height:36px; opacity:1" value="" /> 
       } 
      </th> 
      @foreach (var item in Model) 
      { 

      <tr> 
       <td class="col-md-2"> 
        <span style="font-size: 17px;">@Html.DisplayFor(modelItem => item.movieName)</span> 
       </td> 
       <td class="col-md-2"> 
        <span style="font-size: 17px;">@Html.DisplayFor(modelItem => item.movieReleaseDate)</span> 
       </td> 
       <td class="col-md-1"> 
        <span style="font-size: 17px;">@Html.DisplayFor(modelItem => item.employeeName)</span> 
       </td> 
       <td class="col-md-1"> 
        <span style="font-size: 17px;">@Html.DisplayFor(modelItem => item.Role)</span> 
       </td> 
       <td class="col-md-3 col-md-offset-3"> 
       </td> 

      </tr> 
       <tr> 
        <td colspan="12"> 
         <p style="font-size: 17px; font-style: italic; font-family: 'Roboto', sans-serif"> 
          Movie ID: @Html.DisplayFor(modelItem => item.movieID) 
          <br /> 
          Description: @Html.DisplayFor(modelItem => item.movieDescription) 
          <br /> 
          Starring: // ADD LIST OF EMPLOYEES HERE (item.employeeList) 

         </p> 
        </td> 
       </tr> 
      } 
     </table> 

enter image description here

如果需要任何額外的信息,請讓我知道。

謝謝!

+0

'StarringViewModel'中'employeeName'和'employeeList'有什麼區別?視圖模型與MovieEmployees具有相同的多樣性,但employeeList具有Movie的多樣性。所以看起來你需要每部電影一個視圖模型,但是,如何爲每部電影選擇一個'employeeName'? –

+0

那麼每個員工都可以有一個角色,並在電影中。但是這些關係是1比1.如果該員工有兩個角色,他們實際上在數據庫中有兩個實例。但是對於這種情況,可以說我在一部名爲「SO」的電影中有6名員工。現在,該表格將打印六行,每個員工(和他們的角色)都會在電影標題中顯示同一部電影。所以我希望能夠收集一個列表/字符串/任何每個員工與類似的電影。所以電影中的每個人「SO」以及電影「SO2」中的每個人都是這樣,以便我可以調用該變量並將其顯示在我的View中。有道理? – Austin

回答

1

我想你應該添加一個屬性IEnumerable<string> employeeNames到視圖模型。

var query = 
from m in db.Movies 
from me in m.MovieEmployees 
where (parameter == 1 && m.Name.Contains(searchString)) || 
     (parameter == 2 && me.Employee.Name.Contains(searchString)) || 
     (parameter == 3 && me.Role.RoleType.Contains(searchString)) 
select new StarringViewModel 
{ 
    employeeID = e.ID, 
    movieID = m.ID, roleID = r.ID, 
    movieName = m.Name, 
    movieDescription = m.Description, 
    movieReleaseDate = m.ReleaseDate, 
    employeeBirthdate = me.Employee.Birthday, 
    employeeName = me.Employee.Name, Role = me.Role.RoleType, 
    employeeNames = m.MovieEmployees 
        .Selext(x => x.Employee.Name) 
}; 

(注意,順便說一下,我用的導航性能,而不是連接)。

您可以通過連接顯示他們的員工:

string.Join(", ", employeeNames) 

無論是在視圖,或像在視圖模型EmployeeNamesString的屬性。

的如何做到這一點的視圖模型的一個例子:

public string EmployeeNamesString 
{ 
    get { return string.Join(", ", this.employeeNames); } 
} 

並在取景顯示EmployeeNamesString

+0

太棒了!不過,我仍然對如何實現'string.Join(「,」,employeeNames)「有些困惑。我目前調用'@ Html.DisplayFor(modelItem => item.employeeNames)',它返回名稱,但是都是一個空格字符串。我如何實現字符串格式?謝謝! – Austin

+1

請參閱添加。 –

+0

你好!對不起,再次遇到麻煩,但我是C#的新手,我不確定我應該如何在我的ViewModel中爲'EmployeeNamesString'編寫'set'?如果在過濾搜索中存在註釋,則會出現空指針錯誤。 – Austin