@@ -70,24 +70,39 @@ class Tag {
7070# Query
7171``` csharp
7272// OneToOne、ManyToOne
73- var t0 = fsql .Select <Tag >().Where (a => a .Parent .Parent .Name == " 粤语" ).ToList ();
73+ var t0 = fsql .Select <Tag >()
74+ .Where (a => a .Parent .Parent .Name == " 粤语" )
75+ .ToList ();
7476
7577// OneToMany
76- var t1 = fsql .Select <Tag >().Where (a => a .Tags .AsSelect ().Any (t => t .Parent .Id == 10 )).ToList ();
78+ var t1 = fsql .Select <Tag >()
79+ .Where (a => a .Tags .AsSelect ()
80+ .Any (t => t .Parent .Id == 10 ))
81+ .ToList ();
7782
7883// ManyToMany
79- var t2 = fsql .Select <Song >().Where (s => s .Tags .AsSelect ().Any (t => t .Name == " 国语" )).ToList ();
84+ var t2 = fsql .Select <Song >()
85+ .Where (s => s .Tags .AsSelect ()
86+ .Any (t => t .Name == " 国语" ))
87+ .ToList ();
8088```
8189更多前往Wiki:[ 《Select 查询数据文档》] ( https://github.com/2881099/FreeSql/wiki/%e6%9f%a5%e8%af%a2 )
8290
8391``` csharp
84- var t3 = fsql .Select <Song >.Where (a => new [] { 1 , 2 , 3 }.Contains (a .Id )).ToList ();
92+ var t3 = fsql .Select <Song >()
93+ .Where (a => new [] { 1 , 2 , 3 }.Contains (a .Id ))
94+ .ToList ();
8595```
8696``` csharp
87- var t4 = fsql .Select < Song > s .Where (a => a .CreateTime .Date == DateTime .Now .Date ).ToList ();
97+ var t4 = fsql .Select <Song >()
98+ .Where (a => a .CreateTime .Date == DateTime .Now .Date )
99+ .ToList ();
88100```
89101``` csharp
90- var t5 = fsql .Select < Song > s .OrderBy (a => Guid .NewGuid ()).Limit (1 ).ToList ();
102+ var t5 = fsql .Select <Song >()
103+ .OrderBy (a => Guid .NewGuid ())
104+ .Limit (1 )
105+ .ToList ();
91106```
92107更多前往Wiki:[ 《表达式函数》] ( https://github.com/2881099/FreeSql/wiki/%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0 )
93108
@@ -96,13 +111,11 @@ var t5 = fsql.Select<Song>s.OrderBy(a => Guid.NewGuid()).Limit(1).ToList();
96111
97112``` csharp
98113using (var uow = fsql .CreateUnitOfWork ()) {
114+ var repo1 = uow .GetRepository <Song , int >();
115+ var repo2 = uow .GetRepository <Tag , int >();
99116
100- var songRepository = uow .GetRepository <Song , int >();
101- var tagRepository = uow .GetRepository <Tag , int >();
102-
103- await songRepository .InsertAsync (new Song ());
104- await tagRepository .InsertAsync (new Tag ());
105-
117+ await repo1 .InsertAsync (new Song ());
118+ await repo2 .InsertAsync (new Tag ());
106119 uow .Commit ();
107120}
108121```
@@ -112,7 +125,6 @@ using (var uow = fsql.CreateUnitOfWork()) {
112125
113126``` csharp
114127public class SongContext : DbContext {
115-
116128 public DbSet <Song > Songs { get ; set ; }
117129 public DbSet <Tag > Tags { get ; set ; }
118130
@@ -122,239 +134,6 @@ public class SongContext : DbContext {
122134}
123135
124136using (var ctx = new SongContext ()) {
125- var song = new Song { };
126- await ctx .Songs .AddAsync (song );
127- var id = song .Id ;
128-
129- var adds = Enumerable .Range (0 , 100 ).Select (a => new Song { Title = " xxxx" + a , Url = " url222" }).ToList ();
130- await ctx .Songs .AddRangeAsync (adds );
131-
132- for (var a = 0 ; a < adds .Count ; a ++ )
133- adds [a ].Title = " dkdkdkdk" + a ;
134-
135- ctx .Songs .UpdateRange (adds );
136- ctx .Songs .RemoveRange (adds .Skip (10 ).Take (20 ).ToList ());
137- ctx .Songs .Update (adds .Last ());
138-
139- var tag = new Tag {
140- Name = " testaddsublist" ,
141- Tags = new [] {
142- new Tag { Name = " sub1" },
143- new Tag { Name = " sub2" },
144- new Tag {
145- Name = " sub3" ,
146- Tags = new [] {
147- new Tag { Name = " sub3_01" }
148- }
149- }
150- }
151- };
152- ctx .Tags .Add (tag );
153-
154- await ctx .SaveChangesAsync ();
155- }
156- ```
157-
158- # DataFilter & Tenant
159-
160- ``` csharp
161- public IServiceProvider ConfigureServices (IServiceCollection services ) {
162- services .AddSingleton <IFreeSql >(fsql );
163- services .AddMvc ();
164-
165- var builder = new ContainerBuilder ();
166-
167- builder .RegisterFreeRepository (filter => filter
168- .Apply <ISoftDelete >(" SoftDelete" , a => a .IsDeleted == false )
169- .Apply <ITenant >(" Tenant" , a => a .TenantId == 1 )
170- );
171-
172- builder .Populate (services );
173- var container = builder .Build ();
174- return new AutofacServiceProvider (container );
175- }
176- ```
177-
178- Temporary disable:
179- ``` csharp
180- var songRepository = fsql .GetRepository <Song , int >();
181-
182- using (songRepository .DataFilter .Disable (" Tenant" )) {
183- // Tenant Invalid
184- }
185- // Tenant restore
186- ```
187-
188- # Performance
189-
190- FreeSql Query & Dapper Query
191- ``` shell
192- Elapsed: 00:00:00.6733199; Query Entity Counts: 131072; ORM: Dapper
193-
194- Elapsed: 00:00:00.4554230; Query Tuple Counts: 131072; ORM: Dapper
195-
196- Elapsed: 00:00:00.6846146; Query Dynamic Counts: 131072; ORM: Dapper
197-
198- Elapsed: 00:00:00.6818111; Query Entity Counts: 131072; ORM: FreeSql*
199-
200- Elapsed: 00:00:00.6060042; Query Tuple Counts: 131072; ORM: FreeSql*
201-
202- Elapsed: 00:00:00.4211323; Query ToList< Tuple> Counts: 131072; ORM: FreeSql*
203-
204- Elapsed: 00:00:01.0236285; Query Dynamic Counts: 131072; ORM: FreeSql*
205- ```
206-
207- FreeSql ToList & Dapper Query
208- ``` shell
209- Elapsed: 00:00:00.6707125; ToList Entity Counts: 131072; ORM: FreeSql*
210-
211- Elapsed: 00:00:00.6495301; Query Entity Counts: 131072; ORM: Dapper
212- ```
213-
214- [ Test code] ( FreeSql.Tests.PerformanceTests/MySqlAdoTest.cs )
215-
216- # Contributors
217-
218- [ systemhejiyong] ( https://github.com/systemhejiyong )
219- [ LambertW] ( https://github.com/LambertW )
220- FreeSql 是一个功能强大的 .NETStandard 库,用于对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.6.1+(QQ群:4336577)。
221-
222- | Package Name | NuGet | Downloads |
223- | --------------| ------- | ---- |
224- | FreeSql | [ ![ nuget] ( https://img.shields.io/nuget/v/FreeSql.svg?style=flat-square )] ( https://www.nuget.org/packages/FreeSql ) | [ ![ stats] ( https://img.shields.io/nuget/dt/FreeSql.svg?style=flat-square )] ( https://www.nuget.org/stats/packages/FreeSql?groupby=Version ) |
225- | [ FreeSql.Repository] ( https://github.com/2881099/FreeSql/wiki/Repository ) | [ ![ nuget] ( https://img.shields.io/nuget/v/FreeSql.Repository.svg?style=flat-square )] ( https://www.nuget.org/packages/FreeSql.Repository ) | [ ![ stats] ( https://img.shields.io/nuget/dt/FreeSql.Repository.svg?style=flat-square )] ( https://www.nuget.org/stats/packages/FreeSql.Repository?groupby=Version ) |
226- | [ FreeSql.DbContext] ( https://github.com/2881099/FreeSql.DbContext ) | [ ![ nuget] ( https://img.shields.io/nuget/v/FreeSql.DbContext.svg?style=flat-square )] ( https://www.nuget.org/packages/FreeSql.DbContext ) | [ ![ stats] ( https://img.shields.io/nuget/dt/FreeSql.DbContext.svg?style=flat-square )] ( https://www.nuget.org/stats/packages/FreeSql.DbContext?groupby=Version ) |
227- | [ FreeSql.AdminLTE] ( https://github.com/2881099/FreeSql.AdminLTE ) | [ ![ nuget] ( https://img.shields.io/nuget/v/FreeSql.AdminLTE.svg?style=flat-square )] ( https://www.nuget.org/packages/FreeSql.AdminLTE ) | [ ![ stats] ( https://img.shields.io/nuget/dt/FreeSql.AdminLTE.svg?style=flat-square )] ( https://www.nuget.org/stats/packages/FreeSql.AdminLTE?groupby=Version ) |
228- | [ FreeSql.Connection.Extensions] ( https://github.com/2881099/FreeSql.Connection.Extensions ) | [ ![ nuget] ( https://img.shields.io/nuget/v/FreeSql.Connection.Extensions.svg?style=flat-square )] ( https://www.nuget.org/packages/FreeSql.Connection.Extensions ) | [ ![ stats] ( https://img.shields.io/nuget/dt/FreeSql.Connection.Extensions.svg?style=flat-square )] ( https://www.nuget.org/stats/packages/FreeSql.Connection.Extensions?groupby=Version ) |
229-
230- # 特性
231-
232- - [x] 支持 CodeFirst 迁移;
233- - [x] 支持 DbFirst 从数据库导入实体类,提供失血、贫血、充血三种生成模板;
234- - [x] 大量采用 ExpressionTree 技术提升性能;
235- - [x] 支持深入的类型映射,比如pgsql的数组类型,堪称匠心制作;
236- - [x] 支持丰富的表达式函数;
237- - [x] 支持导航属性查询,和延时加载;
238- - [x] 支持同步/异步数据库操作方法,链式查询方法;
239- - [x] 支持读写分离、分表分库,租户设计,过滤器,乐观锁;
240- - [x] 支持多种数据库,MySql/SqlServer/PostgreSQL/Oracle/Sqlite;
241-
242- | | |
243- | - | - |
244- | ![ image] ( https://user-images.githubusercontent.com/16286519/55138232-f5e19e80-516d-11e9-9144-173cc7e52845.png ) | [ 《Select》] ( https://github.com/2881099/FreeSql/wiki/%e6%9f%a5%e8%af%a2 ) \| [ 《Update》] ( https://github.com/2881099/FreeSql/wiki/%e4%bf%ae%e6%94%b9 ) \| [ 《Insert》] ( https://github.com/2881099/FreeSql/wiki/%e6%b7%bb%e5%8a%a0 ) \| [ 《Delete》] ( https://github.com/2881099/FreeSql/wiki/%e5%88%a0%e9%99%a4 ) |
245- | ![ image] ( https://user-images.githubusercontent.com/16286519/55138241-faa65280-516d-11e9-8b27-139dea46e4df.png ) | [ 《表达式函数》] ( https://github.com/2881099/FreeSql/wiki/%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0 ) \| [ 《CodeFirst》] ( https://github.com/2881099/FreeSql/wiki/CodeFirst ) \| [ 《DbFirst》] ( https://github.com/2881099/FreeSql/wiki/DbFirst ) |
246- | ![ image] ( https://user-images.githubusercontent.com/16286519/55138263-06921480-516e-11e9-8da9-81f18a18b694.png ) | [ 《Repository》] ( https://github.com/2881099/FreeSql/wiki/Repository ) \| [ 《UnitOfWork》] ( https://github.com/2881099/FreeSql/wiki/%e5%b7%a5%e4%bd%9c%e5%8d%95%e5%85%83 ) \| [ 《过滤器》] ( https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8 ) \| [ 《乐观锁》] ( https://github.com/2881099/FreeSql/wiki/%e4%bf%ae%e6%94%b9 ) \| [ 《DbContext》] ( https://github.com/2881099/FreeSql/wiki/DbContext ) |
247- | ![ image] ( https://user-images.githubusercontent.com/16286519/55138284-0eea4f80-516e-11e9-8764-29264807f402.png ) | [ 《读写分离》] ( https://github.com/2881099/FreeSql/wiki/%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb ) \| [ 《分区分表》] ( https://github.com/2881099/FreeSql/wiki/%e5%88%86%e5%8c%ba%e5%88%86%e8%a1%a8 ) \| [ 《租户》] ( https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7 ) \| [ 更新日志] ( https://github.com/2881099/FreeSql/wiki/%e6%9b%b4%e6%96%b0%e6%97%a5%e5%bf%97 ) |
248-
249- # Quick start
250-
251- > dotnet add package FreeSql
252-
253- ``` csharp
254- IFreeSql fsql = new FreeSql .FreeSqlBuilder ()
255- .UseConnectionString (FreeSql .DataType .Sqlite ,
256- @" Data Source=|DataDirectory|\document.db;Pooling=true;Max Pool Size=10" )
257- .UseAutoSyncStructure (true ) // 自动同步实体结构到数据库
258- .Build ();
259-
260- class Song {
261- [Column (IsIdentity = true )]
262- public int Id { get ; set ; }
263- public string Title { get ; set ; }
264- public string Url { get ; set ; }
265- public DateTime CreateTime { get ; set ; }
266-
267- public virtual ICollection <Tag > Tags { get ; set ; }
268- }
269- class Song_tag {
270- public int Song_id { get ; set ; }
271- public virtual Song Song { get ; set ; }
272-
273- public int Tag_id { get ; set ; }
274- public virtual Tag Tag { get ; set ; }
275- }
276- class Tag {
277- [Column (IsIdentity = true )]
278- public int Id { get ; set ; }
279- public string Name { get ; set ; }
280-
281- public int ? Parent_id { get ; set ; }
282- public virtual Tag Parent { get ; set ; }
283-
284- public virtual ICollection <Song > Songs { get ; set ; }
285- public virtual ICollection <Tag > Tags { get ; set ; }
286- }
287- ```
288-
289- # Query
290- ``` csharp
291- // OneToOne、ManyToOne
292- var t0 = fsql .Select <Tag >().Where (a => a .Parent .Parent .Name == " 粤语" ).ToList ();
293-
294- // OneToMany
295- var t1 = fsql .Select <Tag >().Where (a => a .Tags .AsSelect ().Any (t => t .Parent .Id == 10 )).ToList ();
296-
297- // ManyToMany
298- var t2 = fsql .Select <Song >().Where (s => s .Tags .AsSelect ().Any (t => t .Name == " 国语" )).ToList ();
299- ```
300- 更多前往Wiki:[ 《Select 查询数据文档》] ( https://github.com/2881099/FreeSql/wiki/%e6%9f%a5%e8%af%a2 )
301-
302- ``` csharp
303- var t3 = fsql .Select <Song >.Where (a => new [] { 1 , 2 , 3 }.Contains (a .Id )).ToList ();
304- ```
305- ``` csharp
306- var t4 = fsql .Select < Song > s .Where (a => a .CreateTime .Date == DateTime .Now .Date ).ToList ();
307- ```
308- ``` csharp
309- var t5 = fsql .Select < Song > s .OrderBy (a => Guid .NewGuid ()).Limit (1 ).ToList ();
310- ```
311- 更多前往Wiki:[ 《表达式函数》] ( https://github.com/2881099/FreeSql/wiki/%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0 )
312-
313- # Repository & UnitOfWork
314- > dotnet add package FreeSql.Repository
315-
316- ``` csharp
317- using (var uow = fsql .CreateUnitOfWork ()) {
318-
319- var songRepository = uow .GetRepository <Song , int >();
320- var tagRepository = uow .GetRepository <Tag , int >();
321-
322- await songRepository .InsertAsync (new Song ());
323- await tagRepository .InsertAsync (new Tag ());
324-
325- uow .Commit ();
326- }
327- ```
328-
329- # DbContext & DbSet
330- > dotnet add package FreeSql.DbContext
331-
332- ``` csharp
333- public class SongContext : DbContext {
334-
335- public DbSet <Song > Songs { get ; set ; }
336- public DbSet <Tag > Tags { get ; set ; }
337-
338- protected override void OnConfiguring (DbContextOptionsBuilder builder ) {
339- builder .UseFreeSql (fsql );
340- }
341- }
342-
343- using (var ctx = new SongContext ()) {
344- var song = new Song { };
345- await ctx .Songs .AddAsync (song );
346- var id = song .Id ;
347-
348- var adds = Enumerable .Range (0 , 100 ).Select (a => new Song { Title = " xxxx" + a , Url = " url222" }).ToList ();
349- await ctx .Songs .AddRangeAsync (adds );
350-
351- for (var a = 0 ; a < adds .Count ; a ++ )
352- adds [a ].Title = " dkdkdkdk" + a ;
353-
354- ctx .Songs .UpdateRange (adds );
355- ctx .Songs .RemoveRange (adds .Skip (10 ).Take (20 ).ToList ());
356- ctx .Songs .Update (adds .Last ());
357-
358137 var tag = new Tag {
359138 Name = " testaddsublist" ,
360139 Tags = new [] {
@@ -369,36 +148,29 @@ using (var ctx = new SongContext()) {
369148 }
370149 };
371150 ctx .Tags .Add (tag );
372-
373151 await ctx .SaveChangesAsync ();
374152}
375153```
376154
377155# DataFilter & Tenant
378156
379157``` csharp
380- public IServiceProvider ConfigureServices (IServiceCollection services ) {
381- services .AddSingleton <IFreeSql >(fsql );
382- services .AddMvc ();
383-
384- var builder = new ContainerBuilder ();
385-
386- builder .RegisterFreeRepository (filter => filter
158+ public void ConfigureServices (IServiceCollection services ) {
159+ services .AddSingleton <IFreeSql >(Fsql );
160+ services .AddFreeRepository (filter => filter
387161 .Apply <ISoftDelete >(" SoftDelete" , a => a .IsDeleted == false )
388162 .Apply <ITenant >(" Tenant" , a => a .TenantId == 1 )
163+ ,
164+ this .GetType ().Assembly
389165 );
390-
391- builder .Populate (services );
392- var container = builder .Build ();
393- return new AutofacServiceProvider (container );
394166}
395167```
396168
397169Temporary disable:
398170``` csharp
399- var songRepository = fsql .GetRepository <Song , int >();
171+ var repoq = fsql .GetRepository <Song , int >();
400172
401- using (songRepository .DataFilter .Disable (" Tenant" )) {
173+ using (repo1 .DataFilter .Disable (" Tenant" )) {
402174 // Tenant Invalid
403175 }
404176// Tenant restore
0 commit comments