我怎样才能使实体可枚举

时间:2013-12-03 14:32:11

标签: c# asp.net-mvc entity-framework viewmodel

我正在尝试加入列表,将它们添加到viewmodel,并在视图中迭代这些列表。

IList<trace> traces = db.traces.Where(t => t.bureau_rep == "MGS").Take(20).ToList();

IList<business> businesses = new List<business>();

var joined = from t in traces
    join b in businesses
    on t.businessid equals b.businessid
    select new vwhome { traces = t, business = b };

return View(joined);

视图模型看起来像这样......

public class vwhome
{
    public trace traces { get; set; }
    public business business { get; set; }
}

在视图中,我想显示跟踪列表,每个跟踪都有一个应该显示的业务。

  • 通知1业务
  • 通知2业务
  • 通知3业务
  • 通知4业务b
  • 通知5业务b

我的问题是跟踪和业务不可枚举,所以我不能这样做......

public class vwhome
{
    public IList<trace> traces { get; set; }
    public business business { get; set; }
}

我该如何解决这个问题?

------------------------------------

编辑 - 这显然不是一个好的解决方案,但至少它有效......

现在我正在填写视图模型......

IList<trace> traces = db.traces.Where(t => t.bureau_rep == "MGS").Take(20).ToList();

        IList<business> businesses = new List<business>();

        foreach (var item in traces)
        {
            businesses.Add(db.businesses.Find(item.businessid));
        }
        var viewModel = new vwhome();
        viewModel.traces = traces;
        viewModel.business = businesses;

这是我的看法......

@foreach(var item in Model.traces)
    {
    <tr>
        <td>@Html.DisplayFor(model => item.bureau_rep)</td>
        @foreach(var b in Model.business)
        {
            if(b.businessid == item.businessid)
            {
                <td>@Html.DisplayFor(model => b.name)</td>
            }
        }
    </tr>
    }

4 个答案:

答案 0 :(得分:1)

tracebusiness的关系似乎有问题。尝试使用tracebusiness类之间的关系。看来trace类应该与实体模型中的business建立多对一的关系。不知道这些类的模型是什么样的,我建议您确保在类中有适当的引用。如果他们不在那里,请添加以下内容:

将此添加到您的trace课程:

public virtual business business { get; set; }

将以下内容添加到business课程中:

public business()
{
    this.Traces = new List<trace>();
}

public virtual ICollection<trace> Traces { get; set; }

在你的tracemap课程中添加关系:

this.HasOptional(t => t.business)
   .WithMany(t => t.Traces)
   .HasForeignKey(t => t.businessid);

完成此设置后,请尝试设置您的视图模型:

public class vmhome 
{
    public trace trace { get; set; }
    public business business { get; set; }
}

并使用LINQ查询中的关系

var joined = 
from t in traces select new vwhome 
{ 
    trace = t, 
    business = t.business
};

然后在您的视图中,您可以浏览您的参考:

@Html.DisplayFor(modelItem => item.trace.prop_1)
@Html.DisplayFor(modelItem => item.business.name)

您可以省略vm中的business类,只是利用视图中的关系:

@Html.DisplayFor(modelItem => item.trace.business.name)

我希望有所帮助。

答案 1 :(得分:0)

您的tracesbusiness字段需要是字符串,而不是实际对象,并使用跟踪名称和业务填充它们。然后你可以将它传递给你的视图,使其成为屏幕上显示的属性。

您靠近顶部的LINQ查询将返回IEnumerable<vwhome>

答案 2 :(得分:0)

如果我理解正确,您将在Trace类

中需要它
public virtual vwhome vwhome { get; set; }

在你需要的vwhome课程中

public virtual ICollection<Trace > Traces { get; set; }

答案 3 :(得分:0)

您正在使用vwhome个对象的集合,其中每个对象都包含tracevusiness,因此您的视图将如下所示:

<ul>
@foreach (var item in Model)
{
    <li>@(item.trace) @(item.business)</li>
}
</ul>