Twitter Feed Popout byInfofru

C# Entity Framework 使用笔记

### 注意点

```

var table = null;

Using(var context = new dbContext())

{

    table = context.table.where(a => a.filed == value);

}

// error context Dispose

var list = table.ToList();

```

### 关于查询效率优化建议

 

#### 按需查询

 

```

var result = db.Table.Where(a => a.id > 1).ToList();

// 调整为

var result = db.Table.Where(a => a.id > 1).Select(new { field = a.field }).ToList();

```

 

#### 使用贪婪加载

 

```

// 尽可能的减少数据库请求次数

var result = db.Table.Include(a => a.Table2);

```

 

#### 只读操作 使用 AsNoTracking 关键字

 

```

// 取消数据上下文变化跟踪

var result = db.Table.Where(a => a.id > 1).AsNotracking().ToList();

 

// 如果需要 “跟踪” 变化 使用 Attach 关键字

db.Set<Table>().Attach(model);

 

// 直接赋值未跟踪Entity更新变化 手动指定Entity状态为更新

db.Entry(model).State = EntityState.Modified;

 

db.SaveChange();

```

 

#### 查询字符串 使用AsNonUnicode 

 - 在生成sql查询条件的时候 +N处理,避免类型转换 造成性能损失

```

// .Net编码是Unicode格式  生成 

var result = db.Tabel.Where(a=>a.Name== DbFunctions.AsNonUnicode("makmong")).ToList();

```

 

#### 建议使用ViewModel 替代实体 Model

```

var result = db.Table.Select( a=> new ViewModel()
{
   Id = a.Id
}).ToList();

```

 

 

 

---

### EF 扩展批量操作 

#### 源码下载地址

 - EF扩展操作GIT地址

#### 使用说明

##### .Net Core
- Core.Framework.EntityExtend
##### .Net Framework
- Net.Framework.EntityExtend

 

#### 介绍
- 扩展EfCore,支持批量操作

- 查询缓存 (MemoryCache)
- 批量删除
- 批量修改
- 批量插入
- 手工解析 Expression 效率高
- 使用过程遇到问题请留言,谢谢

 

#### 安装教程
- 下载引入项目 拆包即用
- 注意EFCore版本一致[根据项目自行切换]

 

#### 使用说明

```

// 查询缓存 20s
// default 10s
// (Where|Skip|Take) 条件不同 缓存位置不同

// 可选参数
// iCache 自定义 扩展缓存实例 redis sql...
// refresh 是否强制刷新数据
// sliding 是否滑动过期 如果在过期时间内有操作,则以当前时间点延长过期时间
// timeSpan 数据缓存时间
// out cache 查询数据是否使用缓存
// 使用缓存的数据默认取消EF的数据追踪
var model = context.ProjectModuleUser
.UseCache(TimeSpan.FromSeconds(20), iCache: new MemoryCacheService(), refresh:true, sliding:true)
.Where(a => a.id == 1)
.ToList(out bool cache);

 


// 删除指定条件的数据
context.ProjectModuleUser.Delete(a => a.Id > 2);

// 批量修改
context.ProjectModuleUser
.BulkUpdate(new ProjectModuleUser{ BaiduOpenid = "BaiduOpenid" })
.Where(a => a.Id == 2);

// List to Table
// 批量插入 Table 1
context.ProjectModuleUser.BulkInsert(list);

// 批量插入 Table 2
context.ProjectUserGroup.BulkInsert(list2);

// 任务提交
// transaction 是否启用 "事物" default true

var rows = context.BeginSaveChanges();
var rows = context.BeginSaveChanges(out string error);
var rows = context.BeginSaveChanges(out string error , transaction: false);

// 受影响行数
Console.WriteLine(rows);

// 错误信息
Console.WriteLine(error);
```

 

#### 参与贡献
- linq 解析参考 (CSDN作者:道法自然 [地址](https://blog.csdn.net/xftyyyyb/article/details/40144787))

 

#### 转载说明

- 转载请注明出处,谢谢

 

评论 (1) -