2013-05-02 2 views
0

몇 행을 반환하는 LINQ 쿼리가 있습니다. 회사 레코드와 함께 회사 연락처 정보가 포함되도록 가입 정보가 있습니다 (연락처 정보가 모든 행에 대해 반복됩니다). 내보기 페이지에서 머리글 영역에 연락처 정보를 한 번만 표시 한 다음 레코드 집합을 반복하여 세부 정보 데이터를 표시하려고합니다.첫 번째 레코드 집합의 데이터 액세스

루프없이 첫 번째 레코드의 연락처 데이터에 어떻게 액세스합니까?

더 좋은 방법이 있습니까? 나는 하나의 DB 쿼리로 그 정보를 얻는 것이 더 정확할 것이라고 생각하면서 모든 연락처 필드를 ViewBag 변수에 채우는 것을 피하고있었습니다.

BTW 코드 블록을 여기에서 작동시키는 것이 트릭입니다. 항상 코드 버튼을 클릭 한 다음 VS에서 직접 내 코드를 붙여 넣습니다. 때로는 색상 포맷이 작동하고 때로는 그렇지 않습니다. Boossss 아이디어로 작업

<fieldset> 
    <legend>Contact Information</legend> 
    <div class="view-field"> 
     @Html.ValueFor(m => m.CompanyName) 
    </div> 
    <div class="view-field"> 
     @Html.ValueFor(m => m.Name) 
    </div> 
    <div class="view-field"> 
     @Html.ValueFor(m => m.Address1) 
    </div> 
    <div class="view-field"> 
     @Html.ValueFor(m => m.City) 
    </div> 
    <div class="view-field"> 
     @Html.ValueFor(m => m.State) 
    </div> 
    <div class="view-field"> 
     @Html.ValueFor(m => m.Zip) 
    </fieldset> 


     @foreach (var item in Model) 
     { 
      <tr> 
       <td> 
        @Html.DisplayFor(m => item.StatusDate) 
       </td> 
       <td> 
        @Html.DisplayFor(m => item.StatusName) 
       </td> 
       <td> 
        @Html.DisplayFor(m => item.StatusUserName) 
       </td> 
       <td> 
        @Html.DisplayFor(m => item.StatusNote) 
       </td> 
      </tr> 
     } 

편집

,이 LINQ와 뷰 모델로 등장하지만 그들은 확실히 나에게 작동하는 솔루션을받지 못하고있다. 내가 원하는 정확히 VendorStatusHistory 레코드의 subcollection 하나의 레코드 세트를 얻습니다. 뷰 모델의 속성을 표시하려고 할 때 오류가 발생합니다. "정의를 포함하지 않고 확장 메서드가 없습니다 ... 찾을 수 없습니다." 나는 Boossss viewmodel을 사용해 보았지만 같은 오류가 발생했습니다. 내 LINQ 쿼리가 꺼져있는 것 같습니다.

솔브레드 Boossss 의견을 기반으로 업데이트되었습니다.

 public StatusHistoryView VendorStatusHistory(String id) 
    { 
     Guid pid = Guid.Parse(id); 

     StatusHistoryView query = _db.VendorProfiles 
      .Include("VendorStatusHistory") 
      .Include("StatusCodes") 
      .Select(s => new StatusHistoryView 
       { 
        ProfileID = s.ProfileID, 
        Name = s.Name, 
        CompanyName = s.CompanyName, 
        CompanyDBA = s.CompanyDBA, 
        Email = s.Email, 
        Phone = s.Phone, 
        Website = s.Website, 
        Address1 = s.Address1, 
        Address2 = s.Address2, 
        City = s.City, 
        State = s.State, 
        Zip = s.Zip, 
        VendorStatusHistory = s.VendorStatusHistories 
       } 
      ) 
      .Where(x => x.ProfileID == pid).SingleOrDefault();; 

     return query; 
    } 

public class StatusHistoryView 
{ 
    public StatusHistoryView() 
    { 
     this.VendorStatusHistory = new HashSet<VendorStatusHistory>(); 
    } 
    public System.Guid ProfileID { get; set; } 
    public int StatusID { get; set; } 

    [Display(Name = "Full Name")] 
    public string Name { get; set; } 

    [Display(Name = "Email")] 
    public string Email { get; set; } 

    [Display(Name = "Phone")] 
    public string Phone { get; set; } 

    [Display(Name = "Website")] 
    public string Website { get; set; } 

    [Display(Name = "Company")] 
    public string CompanyName { get; set; } 

    [Display(Name = "DBA")] 
    public string CompanyDBA { get; set; } 

    [Display(Name = "Address")] 
    public string Address1 { get; set; } 

    [Display(Name = "Address (extra)")] 
    public string Address2 { get; set; } 

    [Display(Name = "City")] 
    public string City { get; set; } 

    [Display(Name = "State")] 
    public string State { get; set; } 

    [Display(Name = "Zip Code")] 
    public string Zip { get; set; } 

    public virtual ICollection<VendorStatusHistory> VendorStatusHistory { get; set; } 
} 

하고 업데이트 된보기

...

  @model VendorProfileIntranet.Models.StatusHistoryView 

<table id="VendorTable" width="100%" class="gradeA"> 
    <thead> 
     @foreach (var item in Model.VendorStatusHistory) 
     { 
     <tr> 
      <th style="width:200px"> 
       @Html.DisplayNameFor(m => item.DateCreated) 
      </th> 
      <th> 
       @Html.DisplayNameFor(m => item.Status) 
      </th> 
      <th> 
       @Html.DisplayNameFor(m => item.UserName) 
      </th> 
      <th> 
       @Html.DisplayNameFor(m => item.Notes) 
      </th> 
     </tr> 
      break; 
      } 
    </thead> 
    <tbody> 

@foreach (var item in Model.VendorStatusHistory) 
     { 
      <tr> 
       <td> 
        @Html.DisplayFor(m => item.StatusDate) 
       </td> 
       <td> 
        @Html.DisplayFor(m => item.StatusName) 
       </td> 
       <td> 
        @Html.DisplayFor(m => item.StatusUserName) 
       </td> 
       <td> 
        @Html.DisplayFor(m => item.StatusNote) 
       </td> 
      </tr> 

     } 
    </tbody> 
    </tbody> 
</table> 
내가 대신, 세부 기록과 함께 회사의 연락처 정보를 조인 뷰 모델을 생성하고 뷰의 모델로 통과하지 못한 제안
+0

foreach에 연락처 정보를 래핑하고 break 문을 포함하여 한 번만 반복되도록하는 방법이 있습니다. 누군가를 바라보며보다 우아한 해결책을 제안 할 수 있습니다. :) – SQLGrinder

답변

3

과 같이이 후

public class MyViewModel 
{ 
    public string CompanyName { get; set; } 
    public string Name { get; set; } 
    public string Address1 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string Zip { get; set; } 

    public List<RecordDetail> Records { get; set; } 
} 

public class RecordDetail 
{ 
    public DateTime StatusDate { get; set; } 
    public string StatusName { get; set; } 
    public string StatusUserName { get; set; } 
    public string StatusNote { get; set; } 
} 

이 같은보기에서 사용할 수 있습니다 :

@model MyViewModel 
<fieldset> 
<legend>Contact Information</legend> 
<div class="view-field"> 
    @Html.ValueFor(m => m.CompanyName) 
</div> 
<div class="view-field"> 
    @Html.ValueFor(m => m.Name) 
</div> 
<div class="view-field"> 
    @Html.ValueFor(m => m.Address1) 
</div> 
<div class="view-field"> 
    @Html.ValueFor(m => m.City) 
</div> 
<div class="view-field"> 
    @Html.ValueFor(m => m.State) 
</div> 
<div class="view-field"> 
    @Html.ValueFor(m => m.Zip) 
</fieldset> 


    @foreach (var item in Model.Records) 
    { 
     <tr> 
      <td> 
       @Html.DisplayFor(m => item.StatusDate) 
      </td> 
      <td> 
       @Html.DisplayFor(m => item.StatusName) 
      </td> 
      <td> 
       @Html.DisplayFor(m => item.StatusUserName) 
      </td> 
      <td> 
       @Html.DisplayFor(m => item.StatusNote) 
      </td> 
     </tr> 
    } 
+0

Thx, 내가 찾고있는 방향입니다, 그러나 작동하도록 (위 참조) 올바른 LINQ 쿼리 및 ViewModel을 얻을 수 없습니다. – SQLGrinder

+0

안녕 빅, viewmodel 잘 보이지만 :),하지만 당신이 모델은 무엇입니까 보기로 전달? IEnumerable 또는 StatusHistoryView를 전달하고 있습니까? 하나의 StatusHistoryView를 전달해야합니다. – boossss

+0

네, 맞습니다. 그것을 간과하고 LINQ 및보기 페이지에서 IEnumerable을 제거하고 LINQ에 SingleOrDefault를 추가했습니다. 이것은 모든 것을 표시합니다. 그러나 VendorStatusHistory 행의 제목 레이블을 표시하는 데는 한 가지 문제가있었습니다. 표제를 표시하기 위해서, 나는 쉬지 않고 단일 foreach로 돌아 가야했다. (OP의 업데이트를 보자.) 우아하지는 않지만, 99.9 %를 얻었다. – SQLGrinder

관련 문제