首页 > 编程语言 >EF Core异步编程

EF Core异步编程

时间:2024-04-03 23:12:22浏览次数:12  
标签:Core 异步 EF LINQ 运算符 客户端

异步编程

本文内容
异步 LINQ 运算符
客户端异步 LINQ 运算符
当在数据库中执行查询时,异步操作可避免阻止线程。 对于在富客户端应用程序中保持响应式 UI,异步操作很重要,还可以增加 Web 应用程序中的吞吐量,从而释放线程来为 Web 应用程序中的其他请求提供服务。

按照 .NET 标准,EF Core 将为所有执行 I/O 的同步方法提供异步对应项。 它们具有与同步方法相同的效果,并且可与 C# async 和 await 关键字结合使用。 例如,不使用在执行数据库 I/O 时将阻塞线程的 DbContext.SaveChanges,而是改为使用 DbContext.SaveChangesAsync:

C#

复制
var blog = new Blog { Url = "http://sample.com" };
context.Blogs.Add(blog);
await context.SaveChangesAsync();
有关详细信息,请参阅通用 C# 异步编程文档。

警告

EF Core 不支持在同一上下文实例上运行多个并行操作。 应始终等待操作完成,然后再开始下一个操作。 这通常是通过在每个异步操作上使用 await 关键字完成的。

警告

遗憾的是,Microsoft.Data.SqlClient 的异步实现存在一些已知问题(例如 #593、#601 等)。 如果遇到意外的性能问题,请尝试改用同步命令执行,尤其是在处理大型文本或二进制值时。

备注

EF Core 将取消令牌传递给正在使用的基础数据库提供程序(例如 Microsoft.Data.SqlClient)。 可以接受这些令牌,也可以不接受 - 请参阅数据库提供程序的文档。

异步 LINQ 运算符
为了支持以异步方式执行 LINQ 查询,EF Core 提供了一组可执行查询并返回结果的异步扩展方法。 这些与标准同步 LINQ 运算符对应的运算符包括 ToListAsync、SingleAsync、AsAsyncEnumerable 等:

C#

复制
var blogs = await context.Blogs.Where(b => b.Rating > 3).ToListAsync();
请注意,某些 LINQ 运算符(如 Where 或 OrderBy)没有对应的异步版本,因为这些方法仅用于构建 LINQ 表达式树,而不会导致在数据库中执行查询。 只有导致查询执行的操作符才有异步对应项。

重要

EF Core 异步扩展方法在 Microsoft.EntityFrameworkCore 命名空间中定义 。 必须导入此命名空间才能使这些方法可用。

客户端异步 LINQ 运算符
上述异步 LINQ 运算符只能用于 EF 查询,你不能将其用于客户端 LINQ to Objects 查询。 若要在 EF 之外执行客户端异步 LINQ 操作,请使用 System.Linq.Async 包;对于在客户端上执行无法在服务器上转换为评估的操作,此包非常有用。

在 EF Core 6.0 及更低版本中,可惜的是,引用 System.Linq.Async 会导致应用到 EF 的 DbSet 的 LINQ 运算符出现不明确的调用编译错误;这使得很难在同一个项目中同时使用 EF 和 System.Linq.Async。 若要解决此问题,请将 AsQueryable 添加到 DbSet:

C#

复制
var groupedHighlyRatedBlogs = await context.Blogs
.AsQueryable()
.Where(b => b.Rating > 3) // server-evaluated
.AsAsyncEnumerable()
.GroupBy(b => b.Rating) // client-evaluated
.ToListAsync();

标签:Core,异步,EF,LINQ,运算符,客户端
From: https://www.cnblogs.com/zy8899/p/18113687

相关文章

  • EF Core 高效更新
    高效更新本文内容批处理在相关情况下使用ExecuteUpdate和ExecuteDelete批处理EFCore通过在一次往返中自动将所有更新批处理在一起,帮助最大限度地减少往返。考虑以下情况:C#复制varblog=context.Blogs.Single(b=>b.Url=="http://someblog.microsoft.com");blog.Url......
  • asyncio 异步io相关知识
    importasyncio#运行器asyncdefhello_async(delay,words):awaitasyncio.sleep(delay)print(words)#协程与任务asyncdeftest_async():#等待第一个协程hello_async执行完以后再串行执行下一个任务,两个协程没有并发效果start_time=time.time()prin......
  • 关于vue项目在使用vuex的时候,this.$store报错undefined的问题
    vue.runtime.esm.js?c320:4605[Vuewarn]:Errorinrender:"TypeError:Cannotreadpropertiesofundefined(reading'state')。这个问题的主要原因是vuex的版本高于vue的版本。如果vue使用2.XX,vuex的版本要低于4.XX."dependencies":{"axios":"^1.6......
  • Codeforces Round 937 (Div. 4) D题(无脑做法)
    D.ProductofBinaryDecimals题目:提示:首先如果该数目都是1和0组成那肯定输出yes了,还有这个数如果是二进制的乘积也可以yes现在举个例子看看121=11x1114641=11x11x11x11显然也是yes,但是要如何做呢,下面介绍无脑做法。AC代码#include<bits/stdc++.h>usingnamespace......
  • 【教程】宝塔default.db占用空间几十g解决方法|宝塔占用磁盘空间特别大解决方法|宝塔
    目录一、前言二、排查问题三、解决方法一、前言用过宝塔创建网站,大家应该都非常熟悉,但是用随着用的时间越来越多,宝塔所占用的空间也越来越多,不停的加大数据盘都没有用,我原先买了30G够用了,随着时间一长,发现数据盘又满了,不得不又买了20个G扩容,可是过了一段时间又满了。......
  • [转]Docker部署Firefox容器,实现远程浏览器查看内网服务,如登录路由器配置页面等
    类似的镜像很多人都做过,找了一个start数比较多的jlesage/firefox,这个在github上有详细使用说明,我使用docker-compose.yml文件内容如下:version:'3'services:firefox:container_name:firefoximage:jlesage/firefoxports:-"5800:5800"volu......
  • FlinkSQL Unable to create a source for reading table 'default_catalog.default_da
    问题描述使用FlinkSql的jdbc连接器读取mysql的一张表,总是提示 Exceptioninthread"main"org.apache.flink.table.api.ValidationException:Unabletocreateasourceforreadingtable'default_catalog.default_database程序代码publicstaticvoidmai......
  • Codeforces Round 901 (Div. 2) E
    链接有些部分和常规的题目有很大的区别,所以我理解的过程产生的很大很大的障碍。我看了4天吧,这题和题解。好烦。我的第一个思路就是暴力。因为很明显,其实对于每一个二进制位,a,b,m的情况数量是很有限的,就只有8种,而相应的,c,d的对应位是由这4种位运算得到的。我先尝试对每一种情况看......
  • 【Redis】.Net Core 面试破冰
    目录1.Redis简介2.使用场景3.C#具体使用介绍(Nuget)StackExchange.RedisFreeRedisNewLife.RedisServiceStack.Redis(收费)4.Redis常用面试问题以及回答5.建议及经验分享建议Redis经验分享ShareFlow1.Redis简介Redis是一个开源的使用ANSIC语言编写、遵守BSD协议、支持......
  • asp.net core 获取服务小计
    首先,定义服务:publicinterfaceIUserService{stringGetName();voidSetName(stringname);}publicclassUserService:IUserService{privatestringsss;publicstringGetName(){if(string.IsNullOrEmpty(sss))......