从具有外键的关联表中获取数据

时间:2015-11-30 10:28:41

标签: json asp.net-mvc entity-framework linq code-first

有两个名为project和city的表:

   public class Project
   { 
    [Key]
    public int ProjectId { get; set; }
    public string ProjectName { get; set; }
    public int CityID { get; set; }
    public City City { get; set; }
   }

   public class City
   {
    [Key]
    public int CityID { get; set; }
    public string CityName { get; set; }
    public ICollection<Project> Projects { get; set; }
   }

此处,项目类中的CityID是连接两个表的City类的外键。我已正确配置并检查两者是否相互连接。 现在,我有一个Json动作方法来获取Desired属性,如下所示:

   public JsonResult GetProjects()
    {
        var ret = (from project in db.Projects.ToList()
                   orderby project.ProjectId
                   select new
                   {
                       CityName = project.City.CityName,
                       ProjectId = project.ProjectId   
                   }).AsEnumerable();
        return Json(ret, JsonRequestBehavior.AllowGet);
    }

在这里,我试图推出cityName,但我无法取回cityname。它在CityName = project.City.CityName行提供System.NullRefernceException。请建议我现在该做什么。 / strong>我的代码有问题。我能够得到其他房产。

1 个答案:

答案 0 :(得分:2)

如果您使用.ToList().ToArray()之类的内容,那么您正在实现查询。在LINQ to EF中,查询意味着运行SQL查询并使用从DB接收的数据填充类。从那时起,就不可能从dtabase中检索以下引用的属性。

LINQ to EF使用IQueryable<T>接口。 IQueryable<T>是一个&#34;潜在的查询&#34;还没有被执行过#34;当您执行的操作没有实现查询时,您的查询将保持IQueryable<T>,并且不会在数据库中执行。

还有另一件事实现了可查询:枚举它。

因此,在提供运行查询所需的所有信息之前,您需要的是不实现查询。在这种情况下,您必须删除.ToList()