https://github.com/loresoft/EntityFramework.Extended git
也能够在nuget上直接安装这个包,它的说明有点过期了,最新版本已经改用对IQueryable<T>的扩展,而不是DbSet<T>(已经标记为弃用),因此跟我同样有隔离癖好的就能够大胆使用了。下面介绍如何批量删除、更新、查询。 github
原本咱们须要这样删除 sql
//EF原生的删除须要先取出entity而后remove
函数
context.Remove(context.Users.First(u=>u.Key==xxx);
code
//若是要删除更多
ip
foreach
(
var
user
in
context.Users.Where(u => u.FirstName ==
"firstname"
).ToList())
资源
{
rem
context.Remove(user);
get
}
it原本一句sql能够解决的问题,变得复杂了。
使用ORM是为了跟sql尽可能的解耦,而且能在编译时检查出更多的错误,可是上面的写法让人堵的慌,若是你也有这种感受下面的写法是否是就是你脑子里想要的东西呢。
----引用EF Extend Libary后删除只须要一次就完成了,效率高了不少,也不须要太多的链接资源,使用更方便了
//delete all users where FirstName matches
context.Users.Delete(u => u.FirstName ==
"firstname"
);
//固然若是我这样写也能够
context.Users.Where(...).Delete();
当第一次看到EF EL的时候就被这种写法吸引住了,这不就是咱们一直找的东西么。
//批量更新用户名中包含大写J的用户设置工资为999
context.Users.Update(
u => u.Name.Contans(
"J"
),
u2 =>
new
User {Salary = 999});
//第一个参数也能够传入已经有的IQuaryable的参数以下
var
users = context.Users.Where(u => u.FirstName ==
"firstname"
);
context.Users.Update(users, u =>
new
User {FirstName =
"newfirstname"
});<br><br>
//固然了我最喜欢的仍是这样的写法<br>context.Users.Where(u => u.FirstName == "firstname").Update(u=>new User{FirstName = "newfirstname"})
是否是更喜欢这个扩展库了?我是爱不释手了,惋惜如今才开始用。
其实如今的查询已经很棒了,默认的延迟查询都能知足基本需求,可是有时候总但愿更极致一点,好比现有的查询没法知足分页这个顽固的需求。
//看看EF EL怎么解决
// 复用的查询
var
q = db.Tasks.Where(t => t.Priority == 2);
// 获取总数
var
q1 = q.FutureCount();
// 获取分页的数据
var
q2 = q.Skip(pageIndex).Take(pageSize).Future();
// 这里会触发上面全部Future函数中的查询包装到一个链接中执行
int
total = q1.Value;
//由于已经获得结果了,这里不会再次查询
var
tasks = q2.ToList();