【问题标题】:Linq to Entities: Left join to get items NOT found in the joinLinq to Entities:左连接以获取连接中未找到的项目
【发布时间】:2009-05-26 19:39:09
【问题描述】:

我有两个不相关(未定义 FK)的表。第一个表包含一些用户可能无权访问的任务。我需要找到所有这些任务——在这种情况下,连接表将包含空值。我如何获得它们?

设置如下:

TimeData table 
- userID 
- taskID 
- hours


ApprovedTasks table (the one that should contain nulls)
- taskID 
- userID 

SQL 查询如下所示:

select * from TimeData td 
left join ApprovedTasks at
 on at.taskID = td.taskID and at.userID = td.userID
where at.taskID is null

有什么方法可以使用 LINQ to Entity 查询来解决这个问题?

TIA

【问题讨论】:

  • “join”实际上是一个实现细节;我想知道您是否不应该通过包含/任何/除外将其视为不相交的联合。不过,我没有方便的数据库来测试它...
  • 添加到问题中的那一行肯定有帮助!!!

标签: asp.net entity-framework


【解决方案1】:

查看...Disjoint Union in LINQ

这应该可以工作...

var approvedTaks = from at in ApprovedTasks.Except(
                                        from at2 in ApprovedTasks
                                        where at2.userID == userId and at2.taskID==taskId
                                        select at2)
                    where at.userID == userId and at.taskID==taskId
                    select at;

但是很抱歉没有方便的数据库来测试它。

【讨论】:

  • 谢谢大卫,我会去试一试。不过,乍一看,我敢打赌 Entity 框架还没有实现“Except”……我们很快就会看到。
  • 啊...但是您仍然可以获取这两个列表,然后使用 List 或其他在它们上运行 linq 的构造对它们执行 except 。仅仅因为您使用 Linq to Entities 并不意味着您必须始终使用它。我猜他们已经实现了相关的 ANY。
  • 冒着听起来有争议的风险......难道不想避免做两个列表然后做除外吗?这意味着您要从数据库服务器中提取数据并使用 .net 进行工作 - 我猜想为了使其优化,您需要将所有负载保持在数据库服务器上。
  • 你是对的。但我认为你不需要走到那个极端。
猜你喜欢
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
相关资源
最近更新 更多