C# 如何使实体可枚举

C# 如何使实体可枚举,c#,asp.net-mvc,entity-framework,viewmodel,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 businesse

我正在尝试加入列表,将它们添加到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);
在视图中,我想显示跟踪列表,每个跟踪都有一个应该显示的业务

  • 通知1业务a
  • 通知2业务a
  • 通知3业务a
  • 通知4业务b
  • 通知5业务b
我的问题是跟踪和业务是不可枚举的,所以我不能这样做

public class vwhome
{
    public IList<trace> traces { get; set; }
    public business business { get; set; }
}
公共类主页
{
公共IList跟踪{get;set;}
公共业务{get;set;}
}
我应该如何解决这个问题

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

这就是我现在填充viewmodel的方式

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;
IList traces=db.traces.Where(t=>t.bureau\u rep==“MGS”).Take(20.ToList();
IList businesss=新列表();
foreach(跟踪中的var项)
{
business.Add(db.business.Find(item.businessid));
}
var viewModel=new vwhome();
viewModel.traces=跟踪;
viewModel.business=业务;
这是我的观点

@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>
    }
@foreach(Model.traces中的变量项)
{
@DisplayFor(model=>item.bureau\u rep)
@foreach(模型业务中的var b)
{
if(b.businessid==item.businessid)
{
@DisplayFor(model=>b.name)
}
}
}

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


顶部附近的LINQ查询将以
IEnumerable

的形式返回这些查询,如果我理解正确,您将在跟踪类中需要这些查询

public virtual vwhome vwhome { get; set; }
在你的家庭课上,你需要

public virtual ICollection<Trace > Traces { get; set; }
公共虚拟ICollection跟踪{get;set;}
您的视图使用的是一组
vwhome
对象,每个对象都包含一个
跟踪
和一个
vusiness
,因此您的视图看起来像:

<ul>
@foreach (var item in Model)
{
    <li>@(item.trace) @(item.business)</li>
}
</ul>
    @foreach(模型中的var项目) {
  • @(项目跟踪)@(项目业务)
  • }

这似乎是
跟踪
如何与
业务
相关的问题。尝试处理
跟踪
业务
类之间的关系。似乎
跟踪
类应该与实体模型中的
业务
具有多对一关系。由于不知道这些类的模型是什么样子,我建议您确保在类中有适当的引用。如果没有,请添加以下内容:

将此添加到
跟踪
类:

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

public virtual ICollection<trace> Traces { get; set; }
将以下内容添加到您的
业务
类中:

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

public virtual ICollection<trace> Traces { get; set; }
完成此设置后,请尝试按如下方式设置视图模型:

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中省略
业务
类,而只是利用视图中的关系:

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

我希望这会有帮助。

您在找这个吗
traces.GroupBy(x=>x.businessid)
在视图中,我需要访问跟踪实体的属性。跟踪不是单个字段。所以我不能把它当作一个字符串,我会想……就业务而言,我只需要一个字段——业务名称。好吧。然后让你的视图模型只包含那些你需要的字段。我对模型类没有直接的控制权(没有更多的工作)。