LINQ TO EF的基础操作总结

本文主要是简单地讲述对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文件,双击,右击->从数据库更新模型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值