在linq中加入vs子查询?

时间:2011-03-30 07:30:49

标签: linq entity-framework-4

我已经将linq与实体框架结合使用了几个月了,我想知道子查询和连接。

我使用的子查询非常类似:

(from department in
      (from hospital in hospitalRepository.Hospitals
       where hospital.Id == viewModel.DestinationHospitalId
       select hospital.Departments).Single()
 select new { Value = department.Id, Text = department.Name }).ToList();

我从来没有真正使用过join关键字,因为对我而言,它感觉有点太多了。我想要进行连接我需要在我的域对象中使用外键,我并不喜欢这些外键,我觉得子查询更直观。但是,我几乎总是看到人们在linq中使用连接,这让我想知道连接是否更好,或者人们只是习惯使用SQL中的连接。

此外,我的子查询遇到问题,当Hospitals ObjectSet不包含具有我想要的id的医院时。我不知道如何使子查询返回一个空集合。显然,列表的默认值为null。现在我使用Single并捕获异常,但是我希望我的查询只返回一个空列表。

我应该开始使用连接吗?我不应该希望我的查询返回一个空列表并将该情况作为例外处理?如果列表的默认值是空的那么会更好吗?

一些背景知识:此查询的目的是根据另一个下拉列表的选定值填充视图中的下拉框。另一个下拉列表可能没有选择要求第一个下拉列表为空。所以它不是真的例外。

提前致谢。

1 个答案:

答案 0 :(得分:3)

如果我是你,我会肯定开始接受加入。从根本上说,如果你有两个集合,并希望根据某个ID找到相应的行,那么这正是一个连接的用途。不要在数据库方面考虑它 - 从匹配的角度考虑它。

在这种情况下,我不完全确定你需要它,请注意......我怀疑你没问题:

from hospital in hospitalRepository.Hospitals
where hospital.Id == viewModel.DestinationHospitalId
from department in hospital.Departments
select new { Value = department.Id, Text = department.Name }

在这里,如果没有匹配的结果,以空列表结束,以便为您解决问题。但是,对于其他情况,您还应该了解Single的一些替代方法:

  • First
  • FirstOrDefault
  • SingleOrDefault