我已经将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并捕获异常,但是我希望我的查询只返回一个空列表。
我应该开始使用连接吗?我不应该希望我的查询返回一个空列表并将该情况作为例外处理?如果列表的默认值是空的那么会更好吗?
一些背景知识:此查询的目的是根据另一个下拉列表的选定值填充视图中的下拉框。另一个下拉列表可能没有选择要求第一个下拉列表为空。所以它不是真的例外。
提前致谢。
答案 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