C# 如何在ASP.NET MVC4中为两个类编写LINQ连接

C# 如何在ASP.NET MVC4中为两个类编写LINQ连接,c#,linq,ef-code-first,C#,Linq,Ef Code First,首先使用EF代码从联接表访问属性时遇到问题。以下是我在my home controller中的查询: var pcs = from h in db.Hardwares join hwt in db.HardwareTypes on h.HardwareTypeId equals hwt.Id where h.HardwareType.HType == "PC" select new { Hardware = h, HardwareType = hwt };

首先使用EF代码从联接表访问属性时遇到问题。以下是我在my home controller中的查询:

var pcs = from h in db.Hardwares
    join hwt in db.HardwareTypes 
    on h.HardwareTypeId equals hwt.Id
    where h.HardwareType.HType == "PC"
    select new { Hardware = h, HardwareType = hwt };   

ViewBag.Pcs = pcs.ToList();
这是我的HardwareTypes课程:

public class HardwareType
    {
        public int Id { get; set; }
        //[Required]
        //[StringLength(128)]
        public string HType { get; set; }

    }
这是我的硬件课程:

public class Hardware
    {
        public int Id { get; set; }
        public int HardwareTypeId { get; set;}
        public virtual HardwareType HardwareType { get; set; } 

    }

如何更改LINQ查询以使HType在我的ViewBag中?数据库似乎正在正确生成,只是我似乎无法访问HType。我得到一个错误“object”不包含“HType”的定义。

好,完全重置的时间到了。根据聊天记录,我希望您尝试以下操作:

1保留原始LINQ查询,但不要将其设置为匿名类型。创建另一个对象类型,该对象类型将包含硬件和HardwareType属性。这将使PC以及ViewBag.Pcs成为该特定类型的列表

2在视图代码中放置以下foreach循环:

foreach (var item in ViewBag.Pcs as List<YourTypeName>)
{
   var htype = item.HardwareType.HType;
}

让我知道这是否有效。

您是否要求将查询本身更改为h.HardwareType.HType==ViewBag.HType?我只想在我的ViewBag中包含HType我只是想改进您的尝试。这有点令人困惑。您是在尝试查询ViewBag中的内容,还是在尝试使用查询结果填充ViewBag?我想使用查询中的数据填充ViewBag。这将导致在循环的每个迭代中对硬件类型进行延迟评估。您应该使用Include在单个查询中加载硬件类型和硬件列表。我需要加入,我明白。但是您显然有一个基于硬件类的1:1关系,该类具有HardwareType属性。@sehummel。我认为您需要更多地了解实体框架。根据您的类定义,联接是不必要的,因为EF已经知道FK contrainst存在,并将为您完成艰巨的工作。我创建了一个包含属性的ViewModel,并使用了原始LINQ查询。成功了。谢谢,@IronMan84!
var hardwareTypes = pcs.Select(p => p.HardwareType).ToList();