【问题标题】:Selecting multiple one to many relationships in LINQ to SQL using outer joins使用外连接在 LINQ to SQL 中选择多个一对多关系
【发布时间】:2010-07-22 15:41:51
【问题描述】:

我正在使用 .NET 4 和 VS 2010,并且在 .NET 3.5/VS 2008 中遇到同样的问题

结构:
表 1:调用
表 2:地址更改请求
表 3:CallNotes

单个呼叫可以有多个 AddressChangeRequest 和多个 CallNotes。一个客户 (customerKey) 可以有许多呼叫。

LINQ 代码:
返回 db.Calls.Where(c => c.CustomerKey == '...').Select( c => new Call(c.CustomerKey, c.StartTime, c.AddressChangeRequests, c.CallNotes));

Call 是一个需要 AddressChangeRequests 和 CallNotes 列表的域对象。代码按预期返回调用列表,但 SQL 不是最佳的。

上面的代码从 Call 表生成 SQL 作为一个 SELECT,在 AddressChangeRequest 表上有一个左外连接,然后是来自 CallNote 表的单独 SELECT 查询(每个关联的调用一个)

Select ... from Call as c
LEFT OUTER JOIN AddressChangeRequest as acr ON c.id = acr.callId

Select ... from CallNote Where callId = 123
Select ... from CallNote Where callId = 456
Select ... from CallNote Where callId = 789

如果我从代码中删除 AddressChangeRequests,则会为 CallNote 表生成左外连接,并且不再生成单独的 Select 语句。

我的问题是,如何使用 LINQ 生成单个 SQL 语句,如下所示:

Select ... from Call as c
LEFT OUTER JOIN AddressChangeRequest as acr ON c.id = acr.callId
LEFT OUTER JOIN CallNote as cn ON c.id = cn.callId

【问题讨论】:

  • 假设 LINQtoSQL 并且您正在使用 DataLoadOptions.LoadWith?
  • 对 LINQtoSQL 是的,是的,我已经尝试在 CallNote 和 AddressChangeRequest 上使用 DataLoadOptions.LoadWith,启用或禁用没有区别。感谢您的评论,还有其他想法吗?

标签: c# .net linq linq-to-sql c#-4.0


【解决方案1】:

不幸的是,答案是“不”。 L2S 的热切加载支持是原始的。但是,您可以在标准查询工具之上创建自己的版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2023-04-05
    • 2010-09-21
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多