Entity FrameWork 笔记(二)4.0中的查询
2010-04-17 16:28 Henry Cui 阅读(5132) 评论(12) 编辑 收藏 举报这两天一直在用vs2010来试水,发现Entity FrameWork4.0改进了很多,这篇文章先从查询说起。
工具VS2010+SQL2005
准备
首先我们看下生成完成的EDM图:
编写查询
1)Linq to Entities
在开始我还是想像以前一样用Linq to Entities的方式写一个简单的查询:
1 2 3 4 5 6 7 | using ( var ctx = new HJRightPlatEntities()) { var projects = from pro in ctx.Projects where pro.ProjectID.Equals( "Henllyee" ) select pro; Assert.AreEqual(1, projects.Count()); } |
开始编写时,总是获取不到语法的提示,后来才发现是自己没有添加对System.Linq的引用,从而没有Where的扩展方法,真是汗啊。这这里主要是来查询ProjectID为“Henllyee”的Project
下面我们写一个组联的查询:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [TestMethod()] public void QueryInnerJoinByLinq() { using ( var ctx = new HJRightPlatEntities()) { var projects = from pro in ctx.Projects join mo in ctx.Modules on pro.ProjectID equals mo.ProjectID into moduleList where pro.ProjectID.Equals( "Henllyee" ) select new { ProjectName=pro.ProjectName, ModuleList = moduleList }; Assert.AreEqual(7, projects.First().ModuleList.Count()); } } |
下面是段左联的查询:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [TestMethod()] public void QueryLeftJoinByLinq() { using ( var ctx = new HJRightPlatEntities()) { var modules = from pro in ctx.Projects join mo in ctx.Modules on pro.ProjectID equals mo.ProjectID into moduleList where pro.ProjectID.Equals( "Henllyee" ) from prom in moduleList.DefaultIfEmpty() select new { ProjectName = pro.ProjectName, ModuleName = prom.ModuleName }; Assert.AreEqual(7, modules.Count()); } } |
这些都是些基本的Linq 语法,就不再举例子了
2)E-SQL的方式
第一个实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [TestMethod()] public void QueryByESQL() { using ( var ctx = new HJRightPlatEntities()) { var projects = ctx.CreateQuery<Projects>( "Select Value p From Projects AS p Where p.ProjectID=@ProjectID" , new ObjectParameter( "ProjectID" , "Henllyee" )); foreach ( var pro in projects) { Console.WriteLine( "ProjectName:{0}" , pro.ProjectName); } } } |
这个上面的例子中就跟linq to entities的第一个实例差不多
我们看如何实现左连的实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [TestMethod()] public void QueryLeftJoinByESQL() { using ( var ctx = new HJRightPlatEntities()) { var modules = ctx.CreateQuery<Modules>( "Select Value m From Modules AS m Where m.Projects.ProjectID=@ProjectID" , new ObjectParameter( "ProjectID" , "Henllyee" ) ); foreach ( var mo in modules) { Console.WriteLine( "ModuleName:{0} ProjectName:{1}" , mo.ModuleName, mo.Projects.ProjectName); } } } |
其实是通过其外键来实现的,可以看到我们用entity sql是多么轻松地实现左连。这在1.0里面是没有外键查询的支持,而4.0里面已经完全支持了,用了是非常的方便
结束
本文粗略的介绍了Entity FrameWrok中Linq to Entities 跟 Entity Sql的两种查询方式。在后面的文章中会对Entity Sql做详细的说明。

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述