如何在 Linq 中进行完全外连接?
我继承了一个设计不完全优化的数据库,并且我需要操作一些数据。让我对我必须做的事情给出一个更常见的类比:
假设我们有一个 Student
表,一个 StudentClass
表保存他参加的所有课程的记录,以及一个 StudentTeacher
表,用于存储教授该学生的所有教师。是的,我知道这是一个愚蠢的设计,将教师存储在班级表上会更有意义 - 但这就是我们正在研究的。
我现在想要清理数据,我想找到所有学生有老师但没有班级,或者有班级但没有老师的地方。 SQL:
select *
from StudentClass sc
full outer join StudentTeacher st on st.StudentID = sc.StudentID
where st.id is null or sc.id is null
如何在 Linq 中做到这一点?
I've inherited a database that wasn't designed exactly optimally, and I need to manipulate some data. Let me give a more common analogy of the kind of thing I have to do:
Let's say we have a Student
table, a StudentClass
table keeping record of all the classes he attended, and a StudentTeacher
table that stores all the teachers who taught this student. Yes, I know it's a dumb design and it would make more sense to store the teacher on the Class table - but that's what we're working with.
I now want to clean up the data, and I want to find all the places where a student has a teacher but no classes, or a class but no teachers. SQL thus:
select *
from StudentClass sc
full outer join StudentTeacher st on st.StudentID = sc.StudentID
where st.id is null or sc.id is null
How do you do that in Linq?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我想我在这里得到了答案,它并不像我希望的那么优雅,但它应该可以解决问题:
您可能可以将这两个语句压缩为一个,但我认为您会牺牲代码的清晰度。
I think I have the answer here, which is not as elegant as I'd hoped, but it should do the trick:
You could probably squeeze these two statements into one, but I think you'd sacrifice code clarity.
扩展方法:
测试:
Extension method:
Test:
对于给定的 2 个集合 a 和 b,所需的完整外部联接可能如下所示:
如果 a 和 b 不是同一类型,则 2 个单独的 需要左外连接:
这是使用 Concat() 的单行选项:
for the given 2 collections a and b, a required full outer join might be as following:
If a and b are not of the same type, then 2 separate left outer joins are required:
here is a one line option using Concat():
开始...
另请参阅 http://www.linqpad.net/ 了解更多示例
很好玩的工具
A start...
See also http://www.linqpad.net/ for more samples
Good tool to play with
基于 Shaul 的答案,但进行了一些简化:
请注意,对于完整的外部连接,这也可以工作。省略
where
子句并使用上面的第一个select
,而不是第二个。Based on Shaul's answer, but with a little streamlining:
Note that for a full outer join, this can work, too. Leave out the
where
clause and use the firstselect
above, rather than the second.