【问题标题】:Entity Framework - load data from table with 1:1 table involved using one query?实体框架 - 使用一个查询从涉及 1:1 表的表中加载数据?
【发布时间】:2010-07-08 17:34:01
【问题描述】:

我有以下命令:

var query = from x in context.FirstTable.Include("SecondTable")
where x.TestColumn == 5 &&
x.SecondTable.SecondTestColumn == 3
select x;

现在我还想从名为“ThirdTable”的第三个表中加载条目。 但我只能通过 SecondTable 表来引用它。 FirstTable 到 SecondTable 有一个外键,SecondTable 到 ThirdTable 有一个外键,但 FirstTable 到 ThirdTable 没有一个外键。

无法使用以下查询。例外是它无法从 FirstTable 导航到 ThirdTable:

var query = from x in context.FirstTable.Include("SecondTable").Include("ThirdTable")
where x.TestColumn == 5 &&
x.SecondTable.SecondTestColumn == 3
select x;

或者我是否需要为从该查询返回的每个结果集在 ThirdTable 上执行额外查询?

非常感谢您!

克雷格·斯图茨:

我有以下外键:table1 table2 table3
假设表格如下:订单 客户 customer_preferences

所以我不需要从订单到 customer_preferences 的外键。
大多数时候这是不必要的。就在这一次我想保护一些额外的数据库往返。

【问题讨论】:

  • 你有非常好的理由在两端没有FK吗?
  • 我有外键,但我认为从 Table1 到 Table3 的 FK 是不必要的。请看我更新的帖子。还是您认为我应该在订单表中添加 customer_preference_id?
  • 好吧,听起来你有你需要的 FK。我会在下面回答。

标签: c# .net linq-to-sql entity-framework


【解决方案1】:

您可以通过预先加载来做到这一点:

var query = from x in context.FirstTable.Include("SecondTable.ThirdTable") // remember, these are property names, not table names
            where x.TestColumn == 5 
                      && x.SecondTable.SecondTestColumn == 3
            select x;

或者(这是我主要使用的方法)投影:

var query = from x in context.FirstTable
            where x.TestColumn == 5 
                      && x.SecondTable.SecondTestColumn == 3
            select new PresentationModel
            {
                FirstTableColumn = x.Something,
                SecondTableColumn = x.SecondTable.SomethingElse,
                ThirdTableColumn = x.SecondTable.ThirdTable.StillMore
            };

这假定 SecondTable:ThirdTable 是 1:1(你没说)。如果是 1:*,你会这样做:

var query = from x in context.FirstTable
            where x.TestColumn == 5 
                      && x.SecondTable.SecondTestColumn == 3
            select new PresentationModel
            {
                FirstTableColumn = x.Something,
                SecondTableColumn = x.SecondTable.SomethingElse,
                ThirdTableStuff = from y in x.SecondTable.ThirdTable
                                  select y.StillMore
            };

【讨论】:

  • 谢谢,这正是我要找的!
【解决方案2】:

如果我没记错的话,Include 仅适用于第一个表。你可以这样做:

var query = from x in Invoices
   join p in Products 
   on x.Invoice_id equals p.Invoice_id
   join c in Customers 
   on x.Customer_id equals c.Customer_id
   where p.Customer_id == 123 
   && c.Description == "some description"
   select x;

你也可以试试这样的

var query = from x in context.FirstTable.Include("SecondTable").Include("SecondTable.ThirdTable")
where x.TestColumn == 5 &&
x.SecondTable.SecondTestColumn == 3
select x;

【讨论】:

  • 在 EF 查询中几乎从不需要连接(如果您有正确结构的数据库和正确定义的模型)。实际上,您的答案是一个很好的例子,说明了为什么没有连接的查询更具可读性。顺便说一句,如果启用了预加载,则将获取整个实体图,并且不需要包含。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多