@@ -208,222 +208,3 @@ Elapsed: 00:00:00.6495301; Query Entity Counts: 131072; ORM: Dapper
208208
209209[ systemhejiyong] ( https://github.com/systemhejiyong )
210210[ LambertW] ( https://github.com/LambertW )
211- FreeSql 是一个功能强大的 .NETStandard 库,用于对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.6.1+(QQ群:4336577)。
212-
213- | Package Name | NuGet | Downloads |
214- | --------------| ------- | ---- |
215- | 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 ) |
216- | [ 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 ) |
217- | [ 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 ) |
218- | [ 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 ) |
219- | [ 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 ) |
220-
221- # 特性
222-
223- - [x] 支持 CodeFirst 迁移;
224- - [x] 支持 DbFirst 从数据库导入实体类,提供失血、贫血、充血三种生成模板;
225- - [x] 大量采用 ExpressionTree 技术提升性能;
226- - [x] 支持深入的类型映射,比如pgsql的数组类型,堪称匠心制作;
227- - [x] 支持丰富的表达式函数;
228- - [x] 支持导航属性查询,和延时加载;
229- - [x] 支持同步/异步数据库操作方法,链式查询方法;
230- - [x] 支持读写分离、分表分库,租户设计,过滤器,乐观锁;
231- - [x] 支持多种数据库,MySql/SqlServer/PostgreSQL/Oracle/Sqlite;
232-
233- | | |
234- | - | - |
235- | ![ 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 ) |
236- | ![ 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 ) |
237- | ![ 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 ) |
238- | ![ 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 ) |
239-
240- # Quick start
241-
242- > dotnet add package FreeSql
243-
244- ``` csharp
245- IFreeSql fsql = new FreeSql .FreeSqlBuilder ()
246- .UseConnectionString (FreeSql .DataType .Sqlite ,
247- @" Data Source=|DataDirectory|\document.db;Pooling=true;Max Pool Size=10" )
248- .UseAutoSyncStructure (true ) // 自动同步实体结构到数据库
249- .Build ();
250-
251- class Song {
252- [Column (IsIdentity = true )]
253- public int Id { get ; set ; }
254- public string Title { get ; set ; }
255- public string Url { get ; set ; }
256- public DateTime CreateTime { get ; set ; }
257-
258- public virtual ICollection <Tag > Tags { get ; set ; }
259- }
260- class Song_tag {
261- public int Song_id { get ; set ; }
262- public virtual Song Song { get ; set ; }
263-
264- public int Tag_id { get ; set ; }
265- public virtual Tag Tag { get ; set ; }
266- }
267- class Tag {
268- [Column (IsIdentity = true )]
269- public int Id { get ; set ; }
270- public string Name { get ; set ; }
271-
272- public int ? Parent_id { get ; set ; }
273- public virtual Tag Parent { get ; set ; }
274-
275- public virtual ICollection <Song > Songs { get ; set ; }
276- public virtual ICollection <Tag > Tags { get ; set ; }
277- }
278- ```
279-
280- # Query
281- ``` csharp
282- // OneToOne、ManyToOne
283- var t0 = fsql .Select <Tag >().Where (a => a .Parent .Parent .Name == " 粤语" ).ToList ();
284-
285- // OneToMany
286- var t1 = fsql .Select <Tag >().Where (a => a .Tags .AsSelect ().Any (t => t .Parent .Id == 10 )).ToList ();
287-
288- // ManyToMany
289- var t2 = fsql .Select <Song >().Where (s => s .Tags .AsSelect ().Any (t => t .Name == " 国语" )).ToList ();
290- ```
291- 更多前往Wiki:[ 《Select 查询数据文档》] ( https://github.com/2881099/FreeSql/wiki/%e6%9f%a5%e8%af%a2 )
292-
293- ``` csharp
294- var t3 = fsql .Select <Song >.Where (a => new [] { 1 , 2 , 3 }.Contains (a .Id )).ToList ();
295- ```
296- ``` csharp
297- var t4 = fsql .Select < Song > s .Where (a => a .CreateTime .Date == DateTime .Now .Date ).ToList ();
298- ```
299- ``` csharp
300- var t5 = fsql .Select < Song > s .OrderBy (a => Guid .NewGuid ()).Limit (1 ).ToList ();
301- ```
302- 更多前往Wiki:[ 《表达式函数》] ( https://github.com/2881099/FreeSql/wiki/%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0 )
303-
304- # Repository & UnitOfWork
305- > dotnet add package FreeSql.Repository
306-
307- ``` csharp
308- using (var uow = fsql .CreateUnitOfWork ()) {
309-
310- var songRepository = uow .GetRepository <Song , int >();
311- var tagRepository = uow .GetRepository <Tag , int >();
312-
313- await songRepository .InsertAsync (new Song ());
314- await tagRepository .InsertAsync (new Tag ());
315-
316- uow .Commit ();
317- }
318- ```
319-
320- # DbContext & DbSet
321- > dotnet add package FreeSql.DbContext
322-
323- ``` csharp
324- public class SongContext : DbContext {
325-
326- public DbSet <Song > Songs { get ; set ; }
327- public DbSet <Tag > Tags { get ; set ; }
328-
329- protected override void OnConfiguring (DbContextOptionsBuilder builder ) {
330- builder .UseFreeSql (fsql );
331- }
332- }
333-
334- using (var ctx = new SongContext ()) {
335- var song = new Song { };
336- await ctx .Songs .AddAsync (song );
337- var id = song .Id ;
338-
339- var adds = Enumerable .Range (0 , 100 ).Select (a => new Song { Title = " xxxx" + a , Url = " url222" }).ToList ();
340- await ctx .Songs .AddRangeAsync (adds );
341-
342- for (var a = 0 ; a < adds .Count ; a ++ )
343- adds [a ].Title = " dkdkdkdk" + a ;
344-
345- ctx .Songs .UpdateRange (adds );
346- ctx .Songs .RemoveRange (adds .Skip (10 ).Take (20 ).ToList ());
347- ctx .Songs .Update (adds .Last ());
348-
349- var tag = new Tag {
350- Name = " testaddsublist" ,
351- Tags = new [] {
352- new Tag { Name = " sub1" },
353- new Tag { Name = " sub2" },
354- new Tag {
355- Name = " sub3" ,
356- Tags = new [] {
357- new Tag { Name = " sub3_01" }
358- }
359- }
360- }
361- };
362- ctx .Tags .Add (tag );
363-
364- await ctx .SaveChangesAsync ();
365- }
366- ```
367-
368- # DataFilter & Tenant
369-
370- ``` csharp
371- public IServiceProvider ConfigureServices (IServiceCollection services ) {
372- services .AddSingleton <IFreeSql >(fsql );
373- services .AddMvc ();
374-
375- var builder = new ContainerBuilder ();
376-
377- builder .RegisterFreeRepository (filter => filter
378- .Apply <ISoftDelete >(" SoftDelete" , a => a .IsDeleted == false )
379- .Apply <ITenant >(" Tenant" , a => a .TenantId == 1 )
380- );
381-
382- builder .Populate (services );
383- var container = builder .Build ();
384- return new AutofacServiceProvider (container );
385- }
386- ```
387-
388- Temporary disable:
389- ``` csharp
390- var songRepository = fsql .GetRepository <Song , int >();
391-
392- using (songRepository .DataFilter .Disable (" Tenant" )) {
393- // Tenant Invalid
394- }
395- // Tenant restore
396- ```
397-
398- # Performance
399-
400- FreeSql Query & Dapper Query
401- ``` shell
402- Elapsed: 00:00:00.6733199; Query Entity Counts: 131072; ORM: Dapper
403-
404- Elapsed: 00:00:00.4554230; Query Tuple Counts: 131072; ORM: Dapper
405-
406- Elapsed: 00:00:00.6846146; Query Dynamic Counts: 131072; ORM: Dapper
407-
408- Elapsed: 00:00:00.6818111; Query Entity Counts: 131072; ORM: FreeSql*
409-
410- Elapsed: 00:00:00.6060042; Query Tuple Counts: 131072; ORM: FreeSql*
411-
412- Elapsed: 00:00:00.4211323; Query ToList< Tuple> Counts: 131072; ORM: FreeSql*
413-
414- Elapsed: 00:00:01.0236285; Query Dynamic Counts: 131072; ORM: FreeSql*
415- ```
416-
417- FreeSql ToList & Dapper Query
418- ``` shell
419- Elapsed: 00:00:00.6707125; ToList Entity Counts: 131072; ORM: FreeSql*
420-
421- Elapsed: 00:00:00.6495301; Query Entity Counts: 131072; ORM: Dapper
422- ```
423-
424- [ Test code] ( FreeSql.Tests.PerformanceTests/MySqlAdoTest.cs )
425-
426- # Contributors
427-
428- [ systemhejiyong] ( https://github.com/systemhejiyong )
429- [ LambertW] ( https://github.com/LambertW )
0 commit comments