这两天一直在用vs2010来试水,发现Entity FrameWork4.0改进了很多,这篇文章先从查询说起。
工具VS2010+SQL2005
准备
首先我们看下生成完成的EDM图:
编写查询
1)Linq to Entities
在开始我还是想像以前一样用Linq to Entities的方式写一个简单的查询:
1 |
using (var ctx =
new
HJRightPlatEntities()) |
3 |
var
projects = from pro in ctx.Projects |
4 |
where
pro.ProjectID.Equals( "Henllyee" ) |
6 |
Assert.AreEqual(1,
projects.Count()); |
开始编写时,总是获取不到语法的提示,后来才发现是自己没有添加对System.Linq的引用,从而没有Where的扩展方法,真是汗啊。这这里主要是来查询ProjectID为“Henllyee”的Project
下面我们写一个组联的查询:
02 |
public void
QueryInnerJoinByLinq() |
04 |
using
(var ctx = new
HJRightPlatEntities()) |
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" ) |
11 |
ProjectName=pro.ProjectName, |
12 |
ModuleList
= moduleList |
14 |
Assert.AreEqual(7,
projects.First().ModuleList.Count()); |
下面是段左联的查询:
02 |
public void
QueryLeftJoinByLinq() |
04 |
using
(var ctx = new
HJRightPlatEntities()) |
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() |
13 |
ProjectName
= pro.ProjectName, |
14 |
ModuleName
= prom.ModuleName |
16 |
Assert.AreEqual(7,
modules.Count()); |
这些都是些基本的Linq 语法,就不再举例子了
2)E-SQL的方式
第一个实例:
02 |
public void
QueryByESQL() |
04 |
using
(var ctx = new
HJRightPlatEntities()) |
06 |
var
projects =
ctx.CreateQuery<Projects>( |
07 |
"Select
Value p From Projects AS p Where
p.ProjectID=@ProjectID" , |
08 |
new
ObjectParameter( "ProjectID" , "Henllyee" )); |
10 |
foreach
(var pro in projects) |
12 |
Console.WriteLine( "ProjectName:{0}" , |
这个上面的例子中就跟linq to entities的第一个实例差不多
我们看如何实现左连的实现:
02 |
public void
QueryLeftJoinByESQL() |
04 |
using
(var ctx = new
HJRightPlatEntities()) |
06 |
var
modules =
ctx.CreateQuery<Modules>( |
07 |
"Select
Value m From Modules AS m Where
m.Projects.ProjectID=@ProjectID" , |
08 |
new
ObjectParameter( "ProjectID" , "Henllyee" ) |
10 |
foreach
(var mo in modules) |
12 |
Console.WriteLine( "ModuleName:{0}
ProjectName:{1}" , |
14 |
mo.Projects.ProjectName); |
其实是通过其外键来实现的,可以看到我们用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