【问题标题】:fetch data from associated tables having foreign key in between them从具有外键的关联表中获取数据
【发布时间】:2015-11-30 10:28:41
【问题描述】:

有两个表,分别命名为 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。请建议我现在该怎么做。 我的代码有问题。我可以得到其他属性。

【问题讨论】:

  • 但我不能 - 这到底是什么意思?
  • @GertArnold 我已经更正了语法
  • 删除 ToList 后它是如何开始工作的。??有什么问题先生请告诉@GertArnold这里发生了什么

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


【解决方案1】:

当您使用 .ToList().ToArray() 等类似名称时,您就是在具体化查询。在 LINQ to EF 中,具体化查询意味着运行 SQL 查询并使用从 DB 接收到的数据填充您的类。从那时起,就不可能从数据库中检索到以下引用的属性。

LINQ to EF 使用IQueryable&lt;T&gt; 接口。 IQueryable&lt;T&gt; 是尚未“执行”的“潜在查询”。当您做的事情没有实现查询时,您的查询将保持为IQueryable&lt;T&gt;,并且不会在数据库中执行。

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多