从第一记录集访问数据
我有一个LINQ查询返回几行。它有一个连接,因此它包含公司联系信息以及详细记录(因此每行重复的联系信息)。在我的视图页面上,我希望只在标题区域显示联系人信息一次,然后循环访问记录集以显示详细数据。从第一记录集访问数据
如何在没有循环的情况下访问第一条记录中的联系人数据?
有没有更好的方法?我避免将所有联系人字段填充到ViewBag变量中,因为我认为用单个数据库查询来获取它们会更加正确。
BTW获取代码块在这里工作的诀窍是什么?我总是点击代码按钮,然后直接从VS粘贴我的代码。有时候,颜色格式有效,有时不会。
<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>
}
编辑 与Boossss思想工作,我想出了这个LINQ和视图模型,但他们都不太让我一个可行的解决方案。我得到一个单独的记录集,其中包含VendorStatusHistory记录的子集合,这正是我想要的,它会抛出错误,试图显示视图模型的任何属性“不包含定义...并且不能找到扩展方法...”。我尝试使用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>
我建议你没有与详细记录一起加入公司的联系方式,而不是创建一个视图模型,并把它作为您的视图模型像这样:
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>
}
Thx,这是我正在寻找的方向,但不能得到正确的LINQ查询和ViewModel使其工作(见上) – SQLGrinder 2013-05-03 20:54:53
嗨维克,你的viewmodel看起来不错:),但是你是什么模型进入视图?你传递一个IEnumerable
是的你是对的。我忽略了这一点,并从LINQ和查看页面中删除IEnumerable,并将SingleOrDefault添加到LINQ。这显示了一切。但是,这给我显示VendorStatusHistory行的标题标签带来了另外一个问题。为了让标题显示出来,我不得不求助于单一的foreach(参见OP的更新) - 不够高雅,但它让我在99.9%的地方获得了。 – SQLGrinder 2013-05-06 21:18:31
发现一种解决方法是将联系信息包装在foreach中并包含一个break语句,以便它只循环一次。希望有人能提出一个更优雅的解决方案。 :) – SQLGrinder 2013-05-02 19:59:18