程晓晖

博客园 首页 新随笔 联系 订阅 管理

这两天一直在用vs2010来试水,发现Entity FrameWork4.0改进了很多,这篇文章先从查询说起。

工具VS2010+SQL2005

准备

首先我们看下生成完成的EDM图:

image

编写查询

1)Linq to Entities

在开始我还是想像以前一样用Linq to Entities的方式写一个简单的查询:

1 using (var ctx = new HJRightPlatEntities())
2 {
3     var projects = from pro in ctx.Projects
4                    where pro.ProjectID.Equals("Henllyee")
5                    select pro;
6     Assert.AreEqual(1, projects.Count());
7 }

开始编写时,总是获取不到语法的提示,后来才发现是自己没有添加对System.Linq的引用,从而没有Where的扩展方法,真是汗啊。这这里主要是来查询ProjectID为“Henllyee”的Project

下面我们写一个组联的查询:

01 [TestMethod()]
02 public void QueryInnerJoinByLinq()
03 {
04     using (var ctx = new HJRightPlatEntities())
05     {
06         var projects = from pro in ctx.Projects
07                        join mo in ctx.Modules
08                        on pro.ProjectID equals mo.ProjectID  into moduleList
09                        where pro.ProjectID.Equals("Henllyee")
10                        select new {
11                            ProjectName=pro.ProjectName,
12                            ModuleList = moduleList
13                        };
14         Assert.AreEqual(7, projects.First().ModuleList.Count());
15  
16     }
17 }

下面是段左联的查询:

01 [TestMethod()]
02 public void QueryLeftJoinByLinq()
03 {
04     using (var ctx = new HJRightPlatEntities())
05     {
06         var modules = from pro in ctx.Projects
07                        join mo in ctx.Modules
08                        on pro.ProjectID equals mo.ProjectID into moduleList
09                        where pro.ProjectID.Equals("Henllyee")
10                        from prom in moduleList.DefaultIfEmpty()
11                        select new
12                        {
13                            ProjectName = pro.ProjectName,
14                            ModuleName = prom.ModuleName
15                        };
16         Assert.AreEqual(7, modules.Count());
17  
18     }
19 }

这些都是些基本的Linq 语法,就不再举例子了

2)E-SQL的方式

 

第一个实例:

01 [TestMethod()]
02 public void QueryByESQL()
03 {
04     using (var ctx = new HJRightPlatEntities())
05     
06         var projects = ctx.CreateQuery<Projects>(
07             "Select Value p From Projects AS p Where p.ProjectID=@ProjectID",
08             new ObjectParameter("ProjectID","Henllyee"));
09  
10         foreach (var pro in projects)
11         {
12             Console.WriteLine("ProjectName:{0}",
13                 pro.ProjectName);
14         }
15     }
16 }

这个上面的例子中就跟linq to entities的第一个实例差不多

我们看如何实现左连的实现:

01 [TestMethod()]
02 public void QueryLeftJoinByESQL()
03 {
04     using (var ctx = new HJRightPlatEntities())
05     {
06         var modules = ctx.CreateQuery<Modules>(
07             "Select Value m From Modules AS m Where m.Projects.ProjectID=@ProjectID",
08             new ObjectParameter("ProjectID","Henllyee")
09             );
10         foreach (var mo in modules)
11         {
12             Console.WriteLine("ModuleName:{0} ProjectName:{1}",
13                 mo.ModuleName,
14                 mo.Projects.ProjectName);
15  
16         }
17     }
18 }

其实是通过其外键来实现的,可以看到我们用entity sql是多么轻松地实现左连。这在1.0里面是没有外键查询的支持,而4.0里面已经完全支持了,用了是非常的方便

结束

本文粗略的介绍了Entity FrameWrok中Linq to Entities 跟 Entity Sql的两种查询方式。在后面的文章中会对Entity Sql做详细的说明。

 

转自:http://www.cnblogs.com/Henllyee/archive/2010/04/17/1714294.html


posted on 2011-06-28 09:20  fumen  阅读(196)  评论(0编辑  收藏  举报