Entity Framework 简单查询

原文:Entity Framework 简单查询

前言

首先来简单的复习一下如何使用Code First。

第一步还是先建立一个控制台的应用程序,然后通过Nuget添加Entity Framework。那么同时会给packages.config和App.config添加相应的配置。

第二步添加一个数据操作上下文实体类。添加两个构造函数,并添加一个Person的实体类。 在App.config的配置文件中添加相应的数据链接配置。

第三步在调用即可生成相应的数据库。

 EFContext.cs

    public class EFContext:DbContext
    {
        public EFContext()
            : base("EFContext")
        { }

        public EFContext(string connectionstring)
            :base(connectionstring)
        {

        }

        public DbSet<Person> Persons { get; set; }
    }

  App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="EFContext" connectionString="Data Source=.;Database=EFContext;UID=sa;PWD=sa123;" providerName="System.Data.SqlClient"></add>
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

 package.config 

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="5.0.0" targetFramework="net45" />
</packages>

  然后简单的添加了一个实体类

    public class Person
    {
        public int PersonId { get; set; }

        public string PersonName { get; set; }

        public int Age { get; set; }

        public string Address { get; set; }

        public string Email { get; set; }
    }

  最终进行调用

        static void Main(string[] args)
        {
            using (var db = new EFContext("EFContext"))
            {
                var persons = db.Persons.Where(t => t.PersonName == "aehyok").OrderByDescending(t => t.PersonId).ToList();
                foreach (var p in persons)
                {
                    Console.WriteLine("The PersonName is {0} and Age {1}", p.PersonName, p.Age);
                }
            }
            Console.ReadLine();
        }

  运行后控制台没有数据显示,但是在数据库里可以查看到相应的数据库EFContext和数据表People。

 现在我们通过数据库直接为上面建立的数据库EFContext中的People表手动添加了几条数据。

 

然后重新运行程序。可以发现有数据了。

此时可以发现我们的第一个简答的查询语句已经实现了。

  一个数据库上下文的生命周期随着该对象的创建而开始,随着对象的释放(或GC回收)而结束,因此建议在开发过程中使用“Using”编码方式,这样就可以免去手动释放对象的操作。另外对于数据库连接的管理在EF中是透明的,我们一般不需要手动进行处理,当查询一个对象时打开连接当处理完查询的结果集之后会自动关闭连接。

Linq To Entity表达式查询

 查询表达式是C#3.0新增的功能,它是由一组类似于T-SQL或XQuery声明性语句组成,CLR并不能直接读取这种查询表达式而是在编译时转换为对应的方法调用。如下面的例子:

            using (var db = new EFContext("EFContext"))
            {
                var persons = from p in db.Persons
                              where p.PersonName == "aehyok"
                              orderby p.PersonId descending
                              select p;
                foreach (var p in persons)
                {
                    Console.WriteLine("The PersonName is {0} and Age {1}", p.PersonName, p.Age);
                }
            }
            Console.ReadLine();

  得到的结果同上面是一致的。

基于方法的查询

基于方法的查询事实上是一组对象的扩展方法,同Linq查询不同的是这些方法可以直接被CLR识别并运行。

例如上面的方法我们可以转换为如下代码,他们的效果是一样的,返回的都是“IQueryable”对象,这里的代码其实也就是我们开始为创建数据库测试的代码

            using (var db = new EFContext("EFContext"))
            {
                var persons = db.Persons.Where(t => t.PersonName == "aehyok").OrderByDescending(t => t.PersonId).ToList();
                foreach (var p in persons)
                {
                    Console.WriteLine("The PersonName is {0} and Age {1}", p.PersonName, p.Age);
                }
            }
            Console.ReadLine();

  当然执行的结果还是一样的。

原生SQL的查询

EF还支持原生SQL查询例如:

            using (var db = new EFContext("EFContext"))
            {
                var persons = db.Persons.SqlQuery("select * from EFContext..People where PersonName='aehyok'");
                foreach (var p in persons)
                {
                    Console.WriteLine("The PersonName is {0} and Age {1}", p.PersonName, p.Age);
                }
            }
            Console.ReadLine();

  可以直接通过SQL语句的拼接额,当然这里只是做了最简单的实例。

  不仅如此,EF还支持非实体类型的查询:

            using (var db = new EFContext("EFContext"))
            {
                var persons = db.Database.SqlQuery<string>("select PersonName from EFContext..People where PersonName='aehyok'");
                foreach (var p in persons)
                {
                    Console.WriteLine("The PersonName is {0} ", p);
                }
            }

 

当然也支持无返回值的SQL命令:

            using (var db = new EFContext("EFContext"))
            {
                var persons = db.Database.ExecuteSqlCommand("update EFContext..People set Address='中国' where PersonName='aehyok'");
            }

  

时间: 2024-10-03 16:54:31

Entity Framework 简单查询的相关文章

Entity Framework 简单增删改操作

原文:Entity Framework 简单增删改操作 前言  在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作,现在主要来学习一下简单的增加.删除.修改操作. 增加 在EF中添加操作一般有两种方式:一是直接创建对象,然后调用"DbSet"的"Add()"方法进行添加:二是调用数据库上下文的"Entry()"方法并设置对应的状态.无论使用哪种方式最终一定要调用"

Entity Framework 5.0基础系列

原文:Entity Framework 5.0基础系列 1.Entity Framework简介 http://www.cnblogs.com/aehyok/p/3315991.html 2.Entity Framework DBFirst尝试http://www.cnblogs.com/aehyok/p/3318892.html 3.Entity Framework ModelFirst尝试http://www.cnblogs.com/aehyok/p/3323438.html 4.Entit

Entity Framework 5.0系列之数据操作

Entity Framework将概念模型中定义的实体和关系映射到数据源,利用实体框架可以将数据源返回的数据具体化为对象:跟踪对象所做的更改:并发处理:将对象更改传播到数据源等.今天我们就一起讨论如何利用Entity Framework进行查询.插入.更新和删除数据. 查询 我们将使用AdventureWorks数据库来进行今天的所有演示,因此开始之前请准备好相应的数据库.在EF中进行查询应该说是相当简单,只需要定义一个类继承于"DbContext",然后定义对应的"DbSe

Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)

很久没有写博客了,一些读者也经常问问一些问题,不过最近我确实也很忙,除了处理日常工作外,平常主要的时间也花在了继续研究微软的实体框架(EntityFramework)方面了.这个实体框架加入了很多特性(例如LINQ等),目前也已经应用的比较成熟了,之所以一直没有整理成一个符合自己开发模式的实体框架,是因为这个框架和原来我的基于EnterpriseLibrary的模式还是有很大的不同,不过实体框架推出来也很久了,目前也去到了EntityFramework6了,听说7也快出来了. 随着我自己参考阅读

如何解决Entity Framework查询匿名对象后的跨域访问

在Entity Framework中,可以使用lambda表达式进行对数据的查询,而且可以将查询结果直接映射为对象或者对象列表,这极大的提高的开发速度,并且使数据层的数据更加方便处理和传递.但是很多时候,我们不需要把整个表的字段都查出来,如果我们直接把整个数据实体查询出来,就极大的影响了性能,所以我们需要通过查询匿名对象或者已经定义的方式,对数据库进行查询: 1.实例使用的数据实体类: publicclass Category {publicint Id { get; set; }publics

ado.net entity framework查询性能比较

关于ado.net entity framework 性能比较网上也有很多,这里我只是初步的 介绍下ado.net entity framework使用不同的方法查询数据的不同性能 第一部分:重复查询单个实体 第一种:Linq To Entitiess 代码如下: static void Main(string[] args) { DateTime time1; DateTime time2; time1 = DateTime.Now; NorthwindEntities context = n

关于MySql entity framework 6 执行like查询问题解决方案

原文:关于MySql entity framework 6 执行like查询问题解决方案 本人不善于言辞,直接开门见山 环境:EF6.0.0.0+MySQL Server5.6+MySqlConnector6.9.5.0 问题点如下: 1 var username = "admin"; 2 var lst = userService.GetQuery().Where(p => p.UserName.Contains(username)); 3 foreach (var user

Entity Framework学习初级篇5--ObjectQuery查询及方法

ObjectQuery 类支持对实体数据模型(EDM)执行LINQ to Entities和Entity SQl查询.ObjectQuery还实现了一组查询生成器方法,这些方法可用于按顺序构造等效于Entity SQl的查询命令.下面是ObjectQuery的查询生成器方法以及等效的Entity SQl语句: Distinct,Except,GroupBy,Intersect,OfType,OrderBy,Select,SelectValue,Skip,Top,Union,UnionAll,Wh

Entity framework 查询

1.简单查询 2.多表查询 3.高级查询 public List<User> GetUsers(string companyID, string userName, int skip, int limit) { var dc = new DbContext(); var query = (from c in dc.Users join d in dc.UserRoles on c.Id equals d.UserId join e in dc.Roles on d.RoleId equals