GraphQL:和EntityFramework更配哦
GraphQL 既是一種用于 API 的查詢語言也是一個滿足你數(shù)據(jù)查詢的運行時。GraphQL 對你的 API 中的數(shù)據(jù)提供了一套易于理解的完整描述,使得客戶端能夠準確地獲得它需要的數(shù)據(jù),而且沒有任何冗余,也讓 API 更容易地隨著時間推移而演進,還能用于構建強大的開發(fā)者工具。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?——出自?https://graphql.cn
對于查詢,更多的時候,數(shù)據(jù)是在結構化數(shù)據(jù)庫中,API服務通過ORM實現(xiàn)查詢數(shù)據(jù)庫,并且API以不同的url提供給外部調用;試想,我們如果通過ado.net來訪問數(shù)據(jù)庫的話,對于GraphQL的靈活查詢方式,我們怎么通過一條語句完全適配?這是個難點,只能把全部的數(shù)據(jù)集查詢出來,讓graphql在內存篩選自己所需要的數(shù)據(jù),這樣的話,大量數(shù)據(jù)的集合很快就會把內存占完的,不可取,當然像dapper這種直接寫sql的方式就不行了。
這時,EF的優(yōu)勢就顯露出來了,其實EF本身是給后臺程序員使用,封裝了一組Linq表達式轉sql的功能,這樣后臺程序員就不用關心sql語句了;這里,如果能把GraphQL和Linq打通,就可以實現(xiàn)GraphQL接口,后臺開發(fā)也變的簡單了;正好,天作一對,GraphQL碰上了EF,使兩者變的“天衣無縫”。
Michael Staib也是這么做的,并且?guī)砹薍otChocolate,下面是一個GraphQL+EF(sql server)的案例。
添加Nuget包
HotChocolate.AspNetCore
HotChocolate.Data
HotChocolate.Data.EntityFramework
using HotChocolate; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging;namespace GraphQLDemo01 {public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }public void ConfigureServices(IServiceCollection services){services.AddPooledDbContextFactory<AdventureWorks2016Context>((services, options) => options.UseSqlServer(Configuration.GetConnectionString("ConnectionString")).UseLoggerFactory(services.GetRequiredService<ILoggerFactory>())).AddGraphQLServer().AddQueryType<Query>().AddFiltering().AddSorting().AddProjections();}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapGraphQL();});}} }案例數(shù)據(jù)庫是用的sql server官方的demo數(shù)據(jù)庫AdventureWorks,每個查詢方法變的非常簡單,只需要把對應實體集合返回即可,但返回值一定是IQueryabl<>,正是這個特點,讓GraphQL與EF變的這么貼合。特性上增加了一個分頁,考慮到數(shù)據(jù)量大,HotChocolate很貼心的帶了分頁。AdventureWorks生成的實體類和Context就不作顯示了。
使用查詢色彩為紅色的產(chǎn)品,并且按listPrice排序
分頁(UsePaging)查詢person
分頁(UseOffsetPaging)查詢產(chǎn)品
這些查詢如果你跟蹤sql語句的話,會發(fā)現(xiàn)生成的sql會限制查詢范圍,這樣就能提高內存的使用率,當然這個功勞在EF,并不是GraphQL所要做的事,這也是ado.net和dapper類的ORM與GraphQL般配的原因。
相同的GrapQL,下圖是dapper查詢Product表的語句。
下圖是EF生成的語句,EF生成的語句更精確。
總結
以上是生活随笔為你收集整理的GraphQL:和EntityFramework更配哦的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入解析 C# 的 String.Cre
- 下一篇: 如何在 Asp.Net Core 中对请