LINQ TO EF的基础操作总结

EF框架实现增删查改 ef框架: 是微软封装好一种ADO.NET数据实体模型,将数据库结构以ORM模式映射到应用程序中。 优点 简洁的Linq to Sql语句大大提高了开发人员的效率,不要再写复杂的sql语句 缺点 .EF的运行机制会消耗大量内存,大大降低了程序运行效率,从而导致降低了用户在客户端的体验效果 使用方法(控制器代码) 新增 RbacDBEntities db = new RbacDBEntities(); // GET: Role public ActionResu 阅读详情

本文主要是简单地讲述对LINQ TO EF的基本操作,对于数据仓储那些都不进行介绍,有兴趣的可以去了解一下。毕竟“工欲利其事,必先厉其器”嘛。

1. 了解DataContext

想必很多人都用过DataContext来访问数据库吧,这里贴一下DataContext的简单应用实例:

namespace 简单的ORM和LINQToSQL示例
{
    class Program
    {
        //定义一个私有的连接字符串
        private static readonly string connectionString = "Data Source=.;Initial Catalog=db_Customer;Integrated Security=SSPI;";

        static void Main(string[] args)
        {
            //表示Linq to SQL框架的主入口点,DataContext实例,通过一个连接字符串连接你的数据库
            DataContext customerContext = new DataContext(connectionString);
            //Table:表示基础数据库中特定类型的表。
            //GetTable:返回特定类型的对象的集合,其中类型由 TEntity 参数定义
            Table<Customer> customers = customerContext.GetTable<Customer>();

            var seperator = new string('*', 40);
            Console.WriteLine(seperator);
            //查询所有数据
            var startsWith = from c in customers
                             select c;
            Array.ForEach(startsWith.ToArray(), c => Console.WriteLine(c));
            //Log:获取或设置为目标编写SQL查询或命令
            //Out:获取标准输出流
            //customerContext.Log = Console.Out;
            Console.WriteLine(seperator);
            //查询单条数据(按条件查询)
            var singleInfo = from c in customers
                             where c.CustomerID[c.CustomerID.Length - 1] == '3'
                             select c;
            Array.ForEach(singleInfo.ToArray(), c => Console.WriteLine(c));
            Console.WriteLine(seperator);
            //删除指定的一条数据,根据字段CustomerID='1009'
            var deleteInfo = customers.SingleOrDefault(s => s.CustomerID == "1009");
            //Console.WriteLine(deleteInfo);
            if (deleteInfo == null)
            {
                throw new Exception ("没有该条数据");
            }
            customers.DeleteOnSubmit(deleteInfo);
            customerContext.SubmitChanges();
            Console.ReadKey();
        }
    }
}

代码太多核心就是两步操作:

  DataContext context = new DataContext(connectionString);
  Table<Customer> customers = context.GetTable<Customer>();

 然后就是linq的查询操作了,当然像插入、删除记录也是很方便的,直接:

        //插入一条记录
            Customer c = new Customer
            {
                CustomerID = "201",
                ContactName = "徐帅",
                Phone = "12122121121",
                CompanyName="妈蛋的哈哈哈"
            };
            customers.InsertOnSubmit(c);
            //插入多条数据
            var cc = new List<Customer>
            {
                new Customer {CustomerID="202",ContactName="大胖", Phone="32323232323",CompanyName="公司名" },
                new Customer {CustomerID="003",ContactName="fsfds", Phone="656765768",CompanyName="公司的名字" },
                new Customer {CustomerID="004",ContactName="艰苦艰苦", Phone="0897876565",CompanyName="公司的haoming" }
            };
            customers.InsertAllOnSubmit(cc);
            //修改一条记录
            var editInfo = customers.SingleOrDefault<Customer>(s => s.CustomerID =="1001");
            editInfo.ContactName = "修改秀嘎";
            context.SubmitChanges();

映射到数据库表的类叫实体类。对LINQ而言,实体都要用TableAttribute和ColumnAttribute进行修饰
ColumnAttribute可以应用在任何字段或属性上(public、private、internal),不过当LINQ把修改保存回数据库时,实体中只有那些带有ColumnAttribute的元素才会被持久化。
ColumnAttribute的命名参数
命名属性描述备注AutoSync指示何时将该列与数据库进行同步比如:AutoSync.OnInsertCanBeNull指示该列是否可以包含null值 DbType表示DbType枚举值之一 Expression说明计算列是如何产生的 IsDbGenerated指示该列是否是自动生成的比如自动生成的主键列(数据库中用IDENTITY)IsDiscriminator指示该列是否包含LINQ TO SQL继承层次结构的鉴别器值 IsPrimaryKey指示该列是否是主键 IsVersion指示该列是否是数据库时间戳或版本号 Name显示列名称 Storage标识当前实体类中用于存储该列的值的字段 UpdateCheck指示如何检测并发冲突

LINQTOEF的使用

在前面介绍完DataContext后我们就可以来看看LINQ TO EF的操作了。因为其实际操作上也是依赖于DataContext(继承)的,只是实体类我们换成了EF model而已。

接下来我们就要先配置一下我们的DbContextBase,在此处完成数据库连接、也可以实现事务和通用的数据库操作(CURD)。这里我们只是简单的实现数据库连接就好了。

 public partial class DbContextBase : DbContext, IUnitOfWork
    {
        private static string ConnectionString = "";

        public DbContextBase() : base(GetConnectionString())
        {
            //base.Database.Connection.ConnectionString = GetConnectionString();
        }
        /// <summary>
        /// 设置连接字符串
        /// </summary>
        /// <returns></returns>
        private static string GetConnectionString()
        {
            if (string.IsNullOrEmpty(ConnectionString))
            {
                string[] connStrs = ConnectionString.Split(';');
                ConnectionString = "metadata=res://*/LGCP_BaseEFModel.csdl|res://*/LGCP_BaseEFModel.ssdl|res://*/LGCP_BaseEFModel.msl;provider=System.Data.SqlClient;provider connection string=\"";
                //data source=192.168.129.186;initial catalog=LGCP_Base;user id=LangeSoftUser_7dj2q;password=LangeSoftPwd_Pwd;";
                for (int i = 0; i < connStrs.Length; i++)
                {
                    string[] tempStr = connStrs[i].Split('=');
                    switch (tempStr[0].ToLower())
                    {
                        case "server":
                            ConnectionString += "data source=" + tempStr[1] + ";";
                            break;
                        case "uid":
                            ConnectionString += "user id=" + tempStr[1] + "_BaseV22;";
                            break;
                        case "pwd":
                        case "password":
                            ConnectionString += "password=" + tempStr[1] + ";";
                            break;
                        case "database":
                            ConnectionString += "initial catalog=" + tempStr[1] + ";";
                            break;
                    }
                }
                ConnectionString += "MultipleActiveResultSets=True;App=EntityFramework\"";
            }
            return ConnectionString;
        }
}

 接下啦就是使用啦,你可以封装基仓储:

    class TeachIfoRepository
    {
        public DbContextBase db = DbContextFactory.GetDbContext();
        //根据lamda条件获取信息,含升降序
        public IQueryable<T> FindList<T>(Expression<Func<T, bool>> whereLamdba, bool isAsc, Expression<Func<T, object>> orderLamdba) where T : class
        {
            var _list = db.Set<T>().Where(whereLamdba);
            if (isAsc) _list = _list.OrderBy(orderLamdba);
            else _list = _list.OrderByDescending(orderLamdba);

            return _list;
        }
}

这里只是实现查询功能,其他功能可以自行实现。

采用LINQ实现查询功能(左关联):

var courseclassStu = (from c in db.V_UserMgr_TeachInfo_CourseClassAll join
                              cs in db.UserMgr_TeachInfo_CourseStudent 
                              on c.CourseClassID equals cs.CourseClassID join 
                              cl in db.UserMgr_UserInfo_Class on c.ClassID equals cl.ClassID
                              into a_join
                              from cl in a_join.DefaultIfEmpty()
                              where cs.UserID == userID
                              select new
                              {
                                  c.SchoolID,
                                  c.SubjectID,
                                  c.SubjectName,
                                  c.CourseNO,
                                  c.CourseName,
                                  c.CourseClassType,
                                  c.CourseClassID,
                                  c.CourseClassName,
                                  c.ClassID,
                                  cl.ClassName,
                                  c.CollegeID,
                                  c.CountStu,
                                  c.TeacherID,
                                  c.TeacherName,
                                  c.GlobalGrade,
                                  c.GradeID,
                                  c.GradeName
                              }).Distinct().OrderBy(c => c.SubjectID).ThenBy(c => c.CourseNO).ToList();

其中左关联的实现代码是这样的 A join B on xxx into ajoin from B in ajoin.DefaultIfEmpty()

然后我们也可以对得到的数据集进行Distinct操作,

多个字段的排序用OrderBy()和ThenBy()函数即可实现。

好了,简单的LINQTOEF的操作就介绍到这里吧,总体来说还是很简单的。

顺便介绍一下更改数据库表或者视图后更新EF的方法:在工程目录中找到EF的edmx文件,双击,右击->从数据库更新模型。

LINQ_to_EF语法及实例大全 立即下载

相关推荐

Linq to EF增、删、查、改

Linq to EF增、删、查、改.。

Entity Framework应用:使用LINQ操作

LINQ,全称是(集成语言查询),是.NET语言中查询数据的一种技术。是一种机制,它促进了使用LINQ对概念模型的查询。因为LINQ是声明式语言,它让我们聚焦于我们需要什么数据而不是应该如何检索数据。在实体数据模型之上提供了一个很好的抽象,所以我们可以使用LINQ来指定检索什么数据,然后会处理访问数据库事宜,并为我们取到必要的数据。

极客神殿 614

C#连接数据库 —— (一)实体框架(EF)的创建 (Linq To EF

Linq 的语法使用示例如下文章(Lambda表达式): C#连接数据库 —— (二)Linq To EF 的 lambda表达式使用 ,增删查改、判断、分组、排序 实体框架(EF)的创建 选择数据模型项目,并取名添加: 原创文章 64获赞 225访问量 8459 关注 私信 展开阅读全文 作者:浪子花梦

Linq to EFLinq to Object 使用心得

大家都知道Linq既可以用来查询数据库对象(我这里指的是Entity FrameWork里的Model对象),也可以用来查询内存中的IEnumerable对象。 两者单独查询时都不会出现什么问题,不过混合在一起时(一般是用关键字来join连接),要注意的地方就多着了。 情形1:Linq to Object 连接(join) Linq to Entity 我们首先来看这段代码:(注意:

夏日空间 1万+

EF查询 根据字段动态排序

using XXX.Infrastructure.Services; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Dynamic.Core; namespace XXX.Infrastructure.Extensions { ...

gx_up 3396

C#连接数据库 —— (二)Linq To EF 的 lambda表达式使用 ,增删查改、判断、分组、排序

如果不知道如何创建实体框架(EF)的伙伴,也不想上网查找资料 . . . 可以看下面这篇文章: C#连接数据库 —— 实体框架(EF)的创建 (Linq To EFLinq 使用 首先,我们创建数据库实体对象(下面的所有操作都用到这个对象): var DataModelsDb = new DbTrainEntities(); 查询所有数据(对应SQL语句中的 in,这个例外): va...

浪子花梦 2931

Backend - C# 操作数据库 DB(ADO.NET、LINQ to SQL、EF

常见的操作数据库的方法:有三种,分别是ADO.NET(传统)、EF(推荐)、LINQ to SQL(已过时)

是萝卜干呀的博客 544

LINQ to DB 使用教程

LINQ to DB 是一个快速的 LINQ 数据库访问库,它提供了一个简单、轻量、快速且类型安全的层,用于在您的 POCO 对象和数据库之间进行交互。与微型 ORM(如 Dapper、Massive 或 PetaPoco)相比,LINQ to DB 在架构上更进一步,您可以使用 LINQ 表达式而不是魔法字符串,同时保持代码和数据库之间的薄抽象层。LINQ to DB 不是像 LINQ to S...

gitblog_00505的博客 797

EF删除,查询,Linq查询,Lambda查询,修改链接字符串

(1)//删除操作 public bool delete() { try { a_context = new AEntities(); b1 = new Table_1(); //删除只需要写主键就行了 b...

weixin_30788239的博客 154

应用开发之LinqEF

本章简言 上一章笔者对于WinForm开发过程用到的几个知识点做了讲解。笔者们可以以此为开端进行学习。而本章我们来讲一个跟ORM思想有关的知识点。在讲之前让我们想一下关于JAVA的hibernate知识点。hibernate也是ORM框架。记得hibernate里面有一个叫HQL。先不管HQL的好与坏。主要是明白HQL的目地是什么。ORM的思想就是为了让用户在操作数据的时候用上面

学习程序好榜样的博客 703

跟着AI学习C# Day15

本文介绍了LINQ to SQL和Entity Framework(EF)两种.NET数据访问技术。主要内容包括:1) EF Core的安装与基本概念,如ORM映射和LINQ查询支持;2) EF Core使用流程,通过学生信息管理系统示例演示了实体类定义、DbContext创建、数据库初始化及数据操作;3) 常用CRUD方法总结和迁移功能说明;4) 实践练习开发控制台版学生管理系统,实现增删改查功能。重点展示了如何使用EF Core和LINQ高效地操作数据库,适合.NET开发者学习数据访问技术。

蓝胖子不会敲代码的博客 1075

efactive java_Java进击C#——应用开发之LinqEF

本章简言上一章笔者对于WinForm开发过程用到的几个知识点做了讲解。笔者们可以以此为开端进行学习。而本章我们来讲一个跟ORM思想有关的知识点。在讲之前让我们想一下关于JAVA的hibernate知识点。hibernate也是ORM框架。记得hibernate里面有一个叫HQL。先不管HQL的好与坏。主要是明白HQL的目地是什么。ORM的思想就是为了让用户在操作数据的时候用上面向对象的思想来看,而...

weixin_29514317的博客 331

entity framework linq to mysql_Linq实战 之 Linq to Sql及Entity Framework操作详解

一:linq to db的框架1. linq to sql2. linq to ado.net entity frameworklinq to sql是一个团队ef 是一个团队。。。linq to sql => ef 团队。linq to sql 适合一些小型的项目 => sqlserveref 适合中形的项目,而且可以支持 sqllite,mysql,sqlserver掌柜的项目开发...

weixin_35131453的博客 274

【全网最全】EF Core中DbSet/LINQ同步&异步方法完全指南(2025最新版)

本文全面介绍EF Core中DbSet和LINQ的同步与异步操作方法,对比EF6差异并突出EF Core的跨平台优势。主要内容包括:EF Core异步编程的核心优势、核心概念与方法归属、DbSet同步与异步方法对照表、EF Core 7+专属批量操作、完整实战示例代码,以及异步编程的最佳实践。文章提供了可直接复用的代码片段,涵盖实体定义、DbContext配置和业务层异步操作实现,帮助开发者解决UI阻塞、死锁等常见问题,优化.NET Core/.NET 5+应用的数据库访问性能。

野夫怒见不平事,磨损胸中万古刀! 387

Asp.Net MVC +EF(2)Linq查询和Lambda表达式

Linq简介 Linq全称Language Integrated Query(语言集成查询),为我们提供一种统一的方式来查询和操作各种数据。 linq to object:是针对实现IEnumerable的对象的linq linq to sql 是针对关系数据库的linq linq to xml 针对xml文档 Linq除了提供一个同一的API来操作各种数据,还有编译时检查和多态创建表达式的能力...

qq_43071928的博客 1247

linq to ef 通过泛型 操作数据库,分离数据操作与业务逻辑

功能:用一个文件实现了整个dal层,大大减少了代码量 代码如下: using Mvc.Entity; using System; using System.Collections.Generic; using System.Data.Entity.Infrastructure; using System.Linq; using System.Linq.Expressions; using Sy

醉梦的我 2125

Linq To EF 使用小知识(添加记录后获取添加的自增ID和叫“ID”的列不是自增列不让插入的问题)

1:添加记录后,如何获取新添加的ID的值

醉梦的我 1万+

java 10 linq_Java进击C#——应用开发之LinqEF

本章简言上一章笔者对于WinForm开发过程用到的几个知识点做了讲解。笔者们可以以此为开端进行学习。而本章我们来讲一个跟ORM思想有关的知识点。在讲之前让我们想一下关于JAVA的hibernate知识点。hibernate也是ORM框架。记得hibernate里面有一个叫HQL。先不管HQL的好与坏。主要是明白HQL的目地是什么。ORM的思想就是为了让用户在操作数据的时候用上面向对象的思想来看,而...

weixin_31679307的博客 529
上一篇: 存储过程的优缺点
下一篇: SQLSERVER执行时间查询语句
花行远
博客等级 码龄9年 19粉丝 61原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值