如果有人能够在使用LINQ时解释该术语的含义,我将不胜感激.一般来说,我试图了解如何在C#中进行INNER JOIN,LEFT OUTER JOIN等.

我有主表学生存储一些外国ID密钥,然后在运行查询时用它们的名称替换.名称从标记表中读取,例如Marks,Softwareversions,Departments等.所有字段都是必需的,但MarkID.我试图在LINQ中构建的查询是这样的:

SELECT * FROM dbo.Students
INNER JOIN dbo.Departments ON dbo.Students.DepartmentID=dbo.Departments.DepartmentID
INNER JOIN dbo.softwareversions ON dbo.Students.softwareversionID=dbo.softwareversions.softwareversionID
INNER JOIN dbo.Statuses ON dbo.Students.StatusID=dbo.Statuses.StatusID
LEFT JOIN dbo.Marks ON dbo.Students.MarkID=dbo.Marks.MarkID
WHERE dbo.Students.DepartmentID=17;

在阅读了大量文章和观看一些视频之后,我设法让下面的代码得到了解决,但我不觉得我对代码有完整的理解.让我感到困惑的是第5行以in结尾,然后是从m开始的下一行….我很困惑什么做了什么以及从m中发生了什么….这就是LINQ中的代码:

var result = from st in dbContext.Students where st.DepartmentID == 17
             join d in dbContext.Departments on st.DepartmentID equals d.DepartmentID
             join sv in dbContext.softwareversions on st.softwareversionID equals sv.softwareversionID
             join stat in dbContext.Statuses on st.StatusID equals stat.StatusID
             join m in dbContext.Marks on st.MarkID equals m.MarkID into marksGroup
             from m in marksGroup.DefaultIfEmpty()
             select new
             {
                 student = st.StudentName,department = p.DepartmentName,software = sv.softwareversionName,status = st.StatusName,marked = m != null ? m.MarkName : "-- Not marked --"
             };

解决方法

我相信 How to: Perform Left Outer Joins MSDN page的示例部分真的很好解释.让我们把它投射到你的例子中.引用页面的第一段

The first step in producing a left outer join of two collections is to
perform an inner join by using a group join. (See How to: Perform
Inner Joins (C# Programming Guide) for an explanation of this
process.) In this example,the list of Person objects is inner-joined
to the list of Pet objects based on a Person object that matches
Pet.Owner.

因此,在您的情况下,第一步是使用基于MarkID对象的Marks对象列表执行Student对象列表的内部联接,对象与Marks对象中的MarkID匹配.从报价中可以看出,内连接正在使用group join执行.如果您在MSDN页面中查看关于如何执行组连接的注释部分,您可以看到

Each element of the first collection appears in the result set of a
group join regardless of whether correlated elements are found in the
second collection. In the case where no correlated elements are found,
the sequence of correlated elements for that element is empty
. The
result selector therefore has access to every element of the first
collection.

这意味着在你的例子的上下文中,通过使用你有组连接的结果,你有所有的学生对象,以及Marks对象的相关元素序列(如果没有匹配的Marks对象,序列将会是空的.

现在让我们回到如何:执行左外连接MSDN页面,特别是第二段

The second step is to include each element of the first (left)
collection in the result set even if that element has no matches in
the right collection. This is accomplished by calling DefaultIfEmpty
on each sequence of matching elements from the group join. In this
example,DefaultIfEmpty is called on each sequence of matching Pet
objects. The method returns a collection that contains a single,
default value if the sequence of matching Pet objects is empty for any
Person object,thereby ensuring that each Person object is represented
in the result collection.

再次,为了将此项目投射到您的示例中,将在匹配Marks对象的每个序列上调用DefaultIsEmpty().如上所述,如果匹配Marks对象的序列对于任何Student对象为空,则该方法返回包含单个默认值的集合,这确保每个Student对象将在结果集合中表示.因此,您拥有的元素集包含所有Student对象和匹配的Marks对象,或者如果没有匹配的Marks对象,则Marks的默认值(在本例中为null).

c# – 使用LINQ进行左外连接 – 理解代码的更多相关文章

  1. iOS上的C#库

    我已经完成了droid开发,答案就是创建一些使用我的C#库的Web服务,然后让droid使用这些服务.我假设同样的方法适用于iOS(正确的???

  2. Swift 2.0协议扩展和Java / C#抽象类之间有区别吗?

    通过在Swift2.0中添加协议扩展,似乎协议基本上成为Java/C#抽象类.我唯一可以看到的不同之处在于抽象类限制为单一继承,而Swift类型可以符合任何数量的协议.这是对Swift2.0中的协议的正确理解,还是有其他差异?有几个重要的区别…

  3. Swift有一个隐式的Object Initializer,就像在C#中一样吗?

    在C#中,我们有对象初始化器,像这样:Swift有这个吗?例如,我有这个代码:但是想做以下一些事情:谢谢!

  4. Android的C#版本的Console.WriteLine?

    在Android中,写入控制台的最佳方式是什么.在C#中,我使用Log4Net或只使用Console.Write解决方法查看Android.Util.Log的帮助页面.您可以使用:

  5. Android上的C#:Xamarin或Unity?

    还是有其他解决方案?

  6. jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】

    这篇文章主要介绍了jQuery+C#实现参数RSA加密传输功能,结合具体实例形式分析了js使用jsencrypt.js插件前端字符数据处理传输及C#后台数据转换与RSA加密相关操作技巧,并附带jsencrypt.js供读者下载参考使用,需要的朋友可以参考下

  7. 一文简单了解C# 中的DataSet类

    这篇文章主要介绍了一文简单了解C# 中的DataSet类,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

  8. C#中对象与JSON字符串互相转换的三种方式

    这篇文章介绍了C#中对象与JSON字符串互相转换的三种方式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. 如何用nodejs给C#写一个数据表的实体类生成工具

    这篇文章主要介绍了如何用nodejs给C#写一个数据表的实体类生成工具,对nodejs感兴趣的同学,可以参考下

  10. C#中使用迭代器处理等待任务

    这篇文章主要介绍了C#中使用迭代器处理等待任务,迭代器是C#的重要特性,文中用迭代器进行了异步编程的相关实践,需要的朋友可以参考下

随机推荐

  1. c# – (wpf)Application.Current.Resources vs FindResource

    所以,我正在使用C#中的WPF创建一个GUI.它看起来像这样:它现在还没有完成.这两行是我尝试制作一种数据表,它们在XAML中是硬编码的.现在,我正在C#中实现添加新的水果按钮功能.我在XAML中有以下样式来控制行的背景图像应该是什么样子:因此,在代码中,我为每列col0,col1和col2创建一个图像,如果我使用以下代码,它添加了一个如下所示的新行:如你所见,它不太正确……为什么一个似乎忽略了一些属性而另一个没有?

  2. c# – 绑定DataGridTemplateColumn

    似乎我已经打了个墙,试图在DataGrid上使用DataTemplates.我想要做的是使用一个模板来显示每个单元格的两行文本.但是似乎无法以任何方式绑定列.以下代码希望显示我想做的事情.注意每个列的绑定:模板列没有这样的东西,因此,这个xaml不可能工作.我注定要将整个DataTemplate复制到每个列,只是对每个副本都有不同的约束?解决方法我不完全确定你想要做什么,但如果您需要获取整行的DataContext,可以使用RelativeSource绑定来移动视觉树.像这样:

  3. c# – 学习设计模式的资源

    最近我来到了这个设计模式的概念,并对此感到非常热情.你能建议一些帮助我深入设计模式的资源吗?

  4. c# – 是否有支持嵌入HTML页面的跨操作系统GUI框架?

    我想开发一个桌面应用程序来使用跨系统,是否有一个GUI框架,允许我为所有3个平台编写一次代码,并具有完全可脚本化的嵌入式Web组件?我需要它有一个API来在应用程序和网页之间进行交流.我知道C#,JavaScript和一些python.解决方法Qt有这样的事情QWebView.

  5. c# – 通过字符串在对象图中查找属性

    我试图使用任意字符串访问嵌套类结构的各个部分.给出以下(设计的)类:我想要从Person对象的一个实例的“PersonsAddress.HousePhone.Number”获取对象.目前我正在使用反思来做一些简单的递归查找,但是我希望有一些忍者有更好的想法.作为参考,这里是我开发的(crappy)方法:解决方法您可以简单地使用标准的.NETDataBinder.EvalMethod,像这样:

  6. c# – 文件下载后更新页面

    FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true它呈现该页面,然后使用以下元刷新标签来实际向用户提供要下载的文件:你可能需要在你的应用程序中做类似的事情.但是,如果您真的有兴趣在文件完全下载后执行某些操作,那么您的运气不佳,因为没有任何事件可以与浏览器进行通信.执行此操作的唯一方法是上传附件时使用的AJAXupload.

  7. c# – 如何在每个机器应用程序中实现单个实例?

    我必须限制我的.net4WPF应用程序,以便每台机器只能运行一次.请注意,我说每个机器,而不是每个会话.我使用一个简单的互斥体实现单实例应用程序,直到现在,但不幸的是,这样一个互斥是每个会话.有没有办法创建机器互连,还是有其他解决方案来实现每个机器应用程序的单个实例?

  8. c# – WCF和多个主机头

    我的雇主网站有多个主机名,都是同一个服务器,我们只是显示不同的皮肤来进行品牌宣传.不幸的是,在这种情况下,WCF似乎不能很好地工作.我试过overridingthedefaulthostwithacustomhostfactory.这不是一个可以接受的解决方案,因为它需要从所有主机工作,而不仅仅是1.我也看过thisblogpost,但是我无法让它工作,或者不是为了解决我的问题.我得到的错误是“这

  9. c# – ASP.NET MVC模型绑定与表单元素名称中的虚线

    我一直在搜索互联网,试图找到一种方式来容纳我的表单元素的破折号到ASP.NET的控制器在MVC2,3或甚至4中的默认模型绑定行为.作为一名前端开发人员,我更喜欢在我的CSS中使用camelCase或下划线进行破折号.在我的标记中,我想要做的是这样的:在控制器中,我会传入一个C#对象,看起来像这样:有没有办法通过一些正则表达式或其他行为来扩展Controller类来适应这种情况?我讨厌这样的事实,我必须这样做:甚至这个:思考?

  10. c# – 用户界面设计工具

    我正在寻找一个用户界面设计工具来显示文档中可能的GUI.我不能生成代码.我知道MicrosoftVisio提供了一个功能.但有什么办法吗?您使用哪种软件可视化GUI?

返回
顶部