代码改变世界

Entity FrameWork 笔记(二)4.0中的查询

  Henry Cui  阅读(5132)  评论(12编辑  收藏  举报

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

工具VS2010+SQL2005

准备

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

image

编写查询

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做详细的说明。

作者:Henllyee Cui
出处: http://henllyee.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示