Create 增加
using (DataContext db = new DataAccess.DataContext())
{
var entity = new Demo() { Name = "demo" };
//方法一
db.Demos.Add(entity);
//方法二
//var entry = db.Entry(entity);
//entry.State = EntityState.Added;
db.SaveChanges();
}
Update 修改
using (DataContext db = new DataAccess.DataContext())
{
var entity = db.Demos.FirstOrDefault(u => u.Name == "demo");
entity.Name = "demo-改" + DateTime.Now.ToString();
//方式一
//db.Demos.Update(entity);
//方式二
//db.Entry(entity).State = EntityState.Modified;
db.SaveChanges();
}
Delete 删除
using (DataContext db = new DataAccess.DataContext())
{
var entity = db.Demos.FirstOrDefault(u => u.Name == "demo");
//方式一
db.Demos.Remove(entity);
//方式二
db.Entry(entity).State = EntityState.Deleted;
//方式三
db.Demos.Remove(db.Demos.Find(1L ));//Find--主键的值
db.SaveChanges();
}
Select 查询
//单条查询
var query_1 = db.Demos.Where(u => u.Name == "demo").OrderBy(u => u.Name).FirstOrDefault();//升序 asc
var query_2 = db.Demos.Where(u => u.Name == "demo").OrderByDescending(u => u.Name).FirstOrDefault();//降序 desc
//查询 表 总数量
var query_Count = db.Demos.Count();//SELECT COUNT(*) FROM [Demo]
//分页查询
int pageIndex = 1, pageSize = 10;
var query_page = db.Demos.Where(u => u.Name == "demo").OrderByDescending(u => u.Name).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
//查询列表
var query_list_1 = db.Demos.Where(u => u.Name == "demo").OrderBy(u => u.Name).ToList();//SELECT * FROM Demo WHERE Name='demo' ORDER BY Name
var query_list_2 = db.Demos.Where(u => u.Name == "demo").OrderBy(u => u.Name).Take(30).ToList();//查询前30条,exec sp_executesql N' SELECT TOP (@topNum) * FROM Demo WHERE Name=''demo'' ORDER BY Name',N'@topNum int',@topNum=30
//查询指定列 Select
var query_3 = db.Demos.Where(u => u.Name == "demo").Select(s => new { s.Id, s.Name }).FirstOrDefault();// SELECT TOP 1 Id,Name FROM dbo.Demo WHERE name='demo'
IQueryable的延迟性
在构建查询表达式的时候,会有延迟性,就是虽然构建了表达式,但是不会立刻生成Sql发到数据库中,如下代码,运行的时候,可以看到并没有生成相关的sql查询指令。
只有调用以下方法的时候,才会执行正常的查询。
调用 LINQ 运算符时,只会构建查询在内存中的表示形式。 使用结果时,查询只会发送到数据库。
导致查询发送到数据库的最常见操作如下:
使用 for 遍历结果的时候
使用 ToList、ToArray、Single、First 等操作或者异步形式的操作的时候。
使用Count、Sum、Average等聚合或者异步形式聚合操作方式的时候。
跟踪与非跟踪查询 (AsNoTracking)
EFCore默认是跟踪查询,从上可以知道,采用跟踪查询的效率没有采用非跟踪查询的效率高。
全局的跟踪和非跟踪
//开启追踪,默认是TrackAll,可以显示声明
optionsBuilder.UseQueryTrackingBehavior(QueryTrackingBehavior.TrackAll);
//请勿尝试,会禁止追踪所有实体
//optionsBuilder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);