zoukankan      html  css  js  c++  java
  • Entity FrameWork 笔记(二)4.0中的查询

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

    工具VS2010+SQL2005

    准备

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

    image

    编写查询

    1)Linq to Entities

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

                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

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

            [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());
    
                }
            }
    

    下面是段左联的查询:

            [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的方式

    第一个实例:

            [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的第一个实例差不多

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

            [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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。
  • 相关阅读:
    5月,专用程序猿的经典大作——APUE
    [Android]Can&#39;t create handler inside thread that has not called Looper.prepare()
    HDU 4433 locker 2012 Asia Tianjin Regional Contest 减少国家DP
    mac 下有些工具 app 推荐
    机器学习倚门回首嗅青梅
    Android复制iPhone日期和时间选择器
    更新代码和工具,组织起来,提供所有博文(C++,2014.09)
    poj3349
    web项目启动,运行方法
    jstat
  • 原文地址:https://www.cnblogs.com/Henllyee/p/1714294.html
Copyright © 2011-2022 走看看