【问题标题】:MVC models - how to get all the data i need in 1 linqMVC 模型 - 如何在 1 个 linq 中获取我需要的所有数据
【发布时间】:2014-03-09 15:40:24
【问题描述】:

我开始使用 MVC5 并有一个模型结构如下:

我需要用所有数据填充机制模型,即机制、地址、国家名称、操作时间范围,而不是 dayid。

Linq 可以做到这一点吗?如果是这样,我已经尝试了很多方法,但始终无法在结果中获得国家名称或日期。

我在类语句下包含了一些失败的 linq 尝试。

public class Mechanic
{
    public Int32 ID { get; set; }
    public String CompanyName { get; set; }       
    public DateTime CreationTimestamp { get; set; }

    public virtual ICollection<Address> Addresses { get; set; }
    public virtual ICollection<MechanicService> MechanicServices { get; set; }
    public virtual ICollection<MechanicOperationalTimeFrame> MechanicOperationalTimeFrames { get; set; }
} 
public class Address
{
    public Int32 ID { get; set; }
    public int MechanicId { get; set; }
    public String AddressLine1 { get; set; }
    public String AddressLine2 { get; set; }
    public String AddressLine3 { get; set; }
    public String District { get; set; }
    public String Region { get; set; }
    public String PostalCode { get; set; }
    public int CountryId { get; set; }
    public DateTime CreationTimestamp { get; set; }

    public virtual Mechanic Mechanic { get; set; }
    public virtual Country Country { get; set; }
}

public class Country
{
    public int ID { get; set; }
    public String CountryName { get; set; }

    public virtual ICollection<Address> Addresses { get; set; }
}

public class MechanicOperationalTimeFrame
{
    public Int32 ID { get; set; }
    public Int32 DayId { get; set; }
    public String Opening { get; set; }
    public String Closing { get; set; }
    public Int32 MechanicId { get; set; }

    public virtual Mechanic Mechanic { get; set; }
    public virtual Day Day { get; set; }


}

public class Day
{
    public Int32 ID { get; set; }
    public String Name { get; set; }

    public virtual ICollection<MechanicOperationalTimeFrame> MechanicOperationalTimeFrames { get; set; }
}

 public class MechanicService
{
    public Int32 ID { get; set; }
    [StringLength(30), DisplayName("Service provided")]
    public String Service { get; set; }
    public Int32 MechanicId { get; set; }


    public virtual Mechanic Mechanic { get; set; }
}

以下是我的一些失败尝试:

//var mechanic = from m in db.Mechanics
//               join a in db.Addresses on m.ID equals a.MechanicId
//               join ms in db.MechanicServices on m.ID equals ms.MechanicId into services
//               from y in services.DefaultIfEmpty()
//               join mo in db.MechanicOperationalTimeFrames on m.ID equals mo.MechanicId into hours
//               from h in hours.DefaultIfEmpty()
//               select new { m.CompanyName, y.Service, h.DayId };

//Mechanic mechanic = (Mechanic)db.Mechanics
    .Where(a => a.ID == id)
    .Include(a => a.Addresses)
    .Include(a => a.MechanicServices)
    .Include(a => a.MechanicOperationalTimeFrames).SingleOrDefault();


//Mechanic mechanic = db.Mechanics.Where(m => m.ID == id)
//    .Include("Addresses")
//    .Include("MechanicServices")
//    .Include("MechanicOperationalTimeFrames").Single();

这是数据库的快照。

非常感谢任何帮助或指示。

【问题讨论】:

  • 如果您检索 Mechanics,并将其传递给视图,您应该可以访问所有虚拟属性?

标签: sql asp.net-mvc linq model asp.net-mvc-5


【解决方案1】:

您遇到循环数据引用的问题。您的 Address 模型有一个 Country 集合。您的 Country 模型有一个 Address 集合。 EF 将扼杀这个循环引用的数据。至少,您需要从 Country 模型中删除 Address 集合。

public class Country
{
    public int ID { get; set; }
    public String CountryName { get; set; }
}

您对力学和相关模型有类似的问题。

【讨论】:

    猜你喜欢
    • 2019-07-11
    • 1970-01-01
    • 2011-11-04
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多