E文好的可以直接看​​https://github.com/loresoft/EntityFramework.Extended​

也可以在nuget上直接安装这个包,它的说明有点过时了,最新版本已经改用对IQueryable<T>的扩展,而不是DbSet<T>(已经标记为弃用),所以跟我一样有隔离癖好的就可以大胆使用了。下面介绍如何批量删除、更新、查询。

批量删除

本来我们需要这样删除

​​



​//EF原生的删除需要先取出entity然后remove​


​context.Remove(context.Users.First(u=>u.Key==xxx);​


​//如果要删除更多​


​foreach​​​​(​​​​var​​ ​​user ​​​​in​​ ​​context.Users.Where(u => u.FirstName == ​​​​"firstname"​​​​).ToList())​


​{​


​context.Remove(user);​


​}​


本来一句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();​




E文好的可以直接看​​https://github.com/loresoft/EntityFramework.Extended​

也可以在nuget上直接安装这个包,它的说明有点过时了,最新版本已经改用对IQueryable<T>的扩展,而不是DbSet<T>(已经标记为弃用),所以跟我一样有隔离癖好的就可以大胆使用了。下面介绍如何批量删除、更新、查询。

批量删除

本来我们需要这样删除

​​



​//EF原生的删除需要先取出entity然后remove​


​context.Remove(context.Users.First(u=>u.Key==xxx);​


​//如果要删除更多​


​foreach​​​​(​​​​var​​ ​​user ​​​​in​​ ​​context.Users.Where(u => u.FirstName == ​​​​"firstname"​​​​).ToList())​


​{​


​context.Remove(user);​


​}​


本来一句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();​