首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接linq中的vs子查询?

问连接linq中的vs子查询?
EN

Stack Overflow用户
提问于 2011-03-30 07:30:48
回答 1查看 1.9K关注 0票数 1

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

我使用的子查询很多如下所示:

代码语言:javascript
复制
(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并捕获异常,但是我更希望我的查询只返回一个空列表。

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

一些背景:此查询的目的是基于另一个下拉列表的选定值,在我的视图中填充一个下拉列表。另一个下拉列表可能没有选择,这将要求第一个下拉列表为空。所以这并不是一个例外。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-30 07:35:17

如果我是你,我肯定会开始拥抱加入。从根本上说,如果您有两个集合,并且希望根据某个ID查找相应的行,那么这正是连接的目的所在。不要从数据库的角度来考虑它--从匹配的角度来考虑它。

我不太确定你在这种情况下是否需要它,提醒你.我想你不会介意的:

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5483255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档