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