源代码改用vs默认格式化

This commit is contained in:
28810 2019-06-27 09:40:35 +08:00
parent 873364c7ee
commit f8c3608fda
309 changed files with 73814 additions and 67594 deletions

View File

@ -8,17 +8,21 @@ using BenchmarkDotNet.Running;
using Microsoft.EntityFrameworkCore;
//using SqlSugar;
namespace FreeSql.Bechmarker {
namespace FreeSql.Bechmarker
{
public class Program {
public static void Main(string[] args) {
public class Program
{
public static void Main(string[] args)
{
var summaryInsert = BenchmarkRunner.Run<OrmVsInsert>();
var summarySelect = BenchmarkRunner.Run<OrmVsSelect>();
var summaryUpdate = BenchmarkRunner.Run<OrmVsUpdate>();
}
}
public class Orm {
public class Orm
{
public static IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=20")
//.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=20")
@ -39,9 +43,11 @@ namespace FreeSql.Bechmarker {
// });
//}
}
class SongContext : DbContext {
class SongContext : DbContext
{
public DbSet<Song> Songs { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Min Pool Size=21;Max Pool Size=21");
//optionsBuilder.UseMySql("Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Min Pool Size=21;Max Pool Size=21");
}
@ -49,14 +55,16 @@ namespace FreeSql.Bechmarker {
[CoreJob]
[RPlotExporter, RankColumn]
public class OrmVsInsert {
public class OrmVsInsert
{
public IEnumerable<Song> songs;
[Params(1, 500, 1000, 5000, 10000, 50000, 100000)]
public int size;
[GlobalSetup]
public void Setup() {
public void Setup()
{
Orm.fsql.CodeFirst.SyncStructure(typeof(Song), typeof(Song_tag), typeof(Tag));
//Orm.sugar.CodeFirst.InitTables(typeof(Song), typeof(Song_tag), typeof(Tag));
//sugar创建表失败SqlSugar.SqlSugarException: Sequence contains no elements
@ -66,7 +74,8 @@ namespace FreeSql.Bechmarker {
//Orm.sugar.Deleteable<Song>().Where(a => a.Id > 0).ExecuteCommand();
Orm.fsql.Ado.ExecuteNonQuery("delete from efcore_song");
songs = Enumerable.Range(0, size).Select(a => new Song {
songs = Enumerable.Range(0, size).Select(a => new Song
{
Create_time = DateTime.Now,
Is_deleted = false,
Title = $"Insert_{a}",
@ -76,7 +85,8 @@ namespace FreeSql.Bechmarker {
//预热
Orm.fsql.Insert(songs.First()).ExecuteAffrows();
//Orm.sugar.Insertable(songs.First()).ExecuteCommand();
using (var db = new SongContext()) {
using (var db = new SongContext())
{
//db.Configuration.AutoDetectChangesEnabled = false;
db.Songs.AddRange(songs.First());
db.SaveChanges();
@ -90,8 +100,10 @@ namespace FreeSql.Bechmarker {
//public int SqlSugarInsert() => Orm.sugar.Insertable(songs.ToArray()).ExecuteCommand();
[Benchmark]
public int EfCoreInsert() {
using (var db = new SongContext()) {
public int EfCoreInsert()
{
using (var db = new SongContext())
{
//db.Configuration.AutoDetectChangesEnabled = false;
db.Songs.AddRange(songs.ToArray());
return db.SaveChanges();
@ -101,14 +113,16 @@ namespace FreeSql.Bechmarker {
[CoreJob]
[RPlotExporter, RankColumn]
public class OrmVsUpdate {
public class OrmVsUpdate
{
public List<Song> songs;
[Params(1, 500, 1000, 5000, 10000, 50000, 100000)]
public int size;
[GlobalSetup]
public void Setup() {
public void Setup()
{
songs = Orm.fsql.Select<Song>().Limit(size).ToList();
}
@ -119,8 +133,10 @@ namespace FreeSql.Bechmarker {
//public int SqlSugarUpdate() => Orm.sugar.Updateable(songs).ExecuteCommand();
[Benchmark]
public int EfCoreUpdate() {
using (var db = new SongContext()) {
public int EfCoreUpdate()
{
using (var db = new SongContext())
{
//db.Configuration.AutoDetectChangesEnabled = false;
db.Songs.UpdateRange(songs.ToArray());
return db.SaveChanges();
@ -130,13 +146,15 @@ namespace FreeSql.Bechmarker {
[CoreJob]
[RPlotExporter, RankColumn]
public class OrmVsSelect {
public class OrmVsSelect
{
[Params(1, 500, 1000, 5000, 10000, 50000, 100000)]
public int size;
[GlobalSetup]
public void Setup() {
public void Setup()
{
}
@ -147,8 +165,10 @@ namespace FreeSql.Bechmarker {
//public List<Song> SqlSugarSelect() => Orm.sugar.Queryable<Song>().Take(size).ToList();
[Benchmark]
public List<Song> EfCoreSelect() {
using (var db = new SongContext()) {
public List<Song> EfCoreSelect()
{
using (var db = new SongContext())
{
return db.Songs.Take(size).AsNoTracking().ToList();
}
}
@ -157,7 +177,8 @@ namespace FreeSql.Bechmarker {
[FreeSql.DataAnnotations.Table(Name = "freesql_song")]
//[SugarTable("sugar_song")]
[Table("efcore_song")]
public class Song {
public class Song
{
[FreeSql.DataAnnotations.Column(IsIdentity = true)]
//[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
[Key]
@ -175,7 +196,8 @@ namespace FreeSql.Bechmarker {
[FreeSql.DataAnnotations.Table(Name = "freesql_song_tag")]
//[SugarTable("sugar_song_tag")]
[Table("efcore_song_tag")]
public class Song_tag {
public class Song_tag
{
public int Song_id { get; set; }
//[SugarColumn(IsIgnore = true)]
[NotMapped]
@ -189,7 +211,8 @@ namespace FreeSql.Bechmarker {
[FreeSql.DataAnnotations.Table(Name = "freesql_tag")]
//[SugarTable("sugar_tag")]
[Table("efcore_tag")]
public class Tag {
public class Tag
{
[FreeSql.DataAnnotations.Column(IsIdentity = true)]
//[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
[Key]

View File

@ -5,17 +5,20 @@ using System.Threading.Tasks;
using FreeSql;
using Microsoft.AspNetCore.Mvc;
namespace dbcontext_01.Controllers {
namespace dbcontext_01.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase {
public class ValuesController : ControllerBase
{
IFreeSql _orm;
SongContext _songContext;
public ValuesController(SongContext songContext,
IFreeSql orm1, IFreeSql orm2,
IFreeSql<long> orm3
) {
)
{
_songContext = songContext;
_orm = orm1;
@ -23,11 +26,13 @@ namespace dbcontext_01.Controllers {
// GET api/values
[HttpGet]
async public Task<string> Get() {
async public Task<string> Get()
{
long id = 0;
try {
try
{
var repos2Song = _orm.GetRepository<Song, int>();
repos2Song.Where(a => a.Id > 10).ToList();
@ -61,7 +66,8 @@ namespace dbcontext_01.Controllers {
var ctx = _songContext;
var tag = new Tag {
var tag = new Tag
{
Name = "testaddsublist",
Tags = new[] {
new Tag { Name = "sub1" },
@ -79,7 +85,8 @@ namespace dbcontext_01.Controllers {
ctx.UnitOfWork.GetOrBeginTransaction();
var tagAsync = new Tag {
var tagAsync = new Tag
{
Name = "testaddsublist",
Tags = new[] {
new Tag { Name = "sub1" },
@ -141,7 +148,8 @@ namespace dbcontext_01.Controllers {
//打包【执行队列】,提交事务
using (var uow = _orm.CreateUnitOfWork()) {
using (var uow = _orm.CreateUnitOfWork())
{
var reposSong = uow.GetRepository<Song, int>();
reposSong.Where(a => a.Id > 10).ToList();
@ -205,7 +213,9 @@ namespace dbcontext_01.Controllers {
// await ctx.SaveChangesAsync();
//}
} catch {
}
catch
{
var item = await _orm.Select<Song>().Where(a => a.Id == id).FirstAsync();
throw;
@ -219,23 +229,27 @@ namespace dbcontext_01.Controllers {
// GET api/values/5
[HttpGet("{id}")]
public ActionResult<string> Get(int id) {
public ActionResult<string> Get(int id)
{
return "value";
}
// POST api/values
[HttpPost]
public void Post([FromBody] string value) {
public void Post([FromBody] string value)
{
}
// PUT api/values/5
[HttpPut("{id}")]
public void Put(int id, [FromBody] string value) {
public void Put(int id, [FromBody] string value)
{
}
// DELETE api/values/5
[HttpDelete("{id}")]
public void Delete(int id) {
public void Delete(int id)
{
}
}
}

View File

@ -3,9 +3,11 @@ using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
namespace dbcontext_01 {
namespace dbcontext_01
{
public class SongContext : DbContext {
public class SongContext : DbContext
{
public DbSet<Song> Songs { get; set; }
public DbSet<Tag> Tags { get; set; }
@ -16,7 +18,8 @@ namespace dbcontext_01 {
}
public class Song {
public class Song
{
[Column(IsIdentity = true)]
public int Id { get; set; }
public DateTime? Create_time { get; set; }
@ -29,7 +32,8 @@ namespace dbcontext_01 {
[Column(IsVersion = true)]
public long versionRow { get; set; }
}
public class Song_tag {
public class Song_tag
{
public int Song_id { get; set; }
public virtual Song Song { get; set; }
@ -37,7 +41,8 @@ namespace dbcontext_01 {
public virtual Tag Tag { get; set; }
}
public class Tag {
public class Tag
{
[Column(IsIdentity = true)]
public int Id { get; set; }
public int? Parent_id { get; set; }

View File

@ -17,7 +17,8 @@ namespace dbcontext_01
public class Program
{
public class Song {
public class Song
{
[Column(IsIdentity = true)]
public int Id { get; set; }
public string BigNumber { get; set; }
@ -26,16 +27,19 @@ namespace dbcontext_01
public long versionRow { get; set; }
}
public class SongContext : DbContext {
public class SongContext : DbContext
{
public DbSet<Song> Songs { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder builder) {
protected override void OnConfiguring(DbContextOptionsBuilder builder)
{
builder.UseFreeSql(fsql);
}
}
static IFreeSql fsql;
public static void Main(string[] args) {
public static void Main(string[] args)
{
fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\dd2.db;Pooling=true;Max Pool Size=10")
.UseAutoSyncStructure(true)
@ -46,7 +50,8 @@ namespace dbcontext_01
.Build();
using (var ctx = new SongContext()) {
using (var ctx = new SongContext())
{
var song = new Song { BigNumber = "1000000000000000000" };
ctx.Songs.Add(song);

View File

@ -34,17 +34,21 @@ namespace dbcontext_01
(cmd, log) => Trace.WriteLine(log)
)
.Build();
Fsql.Aop.SyncStructureBefore = (s, e) => {
Fsql.Aop.SyncStructureBefore = (s, e) =>
{
Console.WriteLine(e.Identifier + ": " + string.Join(", ", e.EntityTypes.Select(a => a.FullName)));
};
Fsql.Aop.SyncStructureAfter = (s, e) => {
Fsql.Aop.SyncStructureAfter = (s, e) =>
{
Console.WriteLine(e.Identifier + ": " + string.Join(", ", e.EntityTypes.Select(a => a.FullName)) + " " + e.ElapsedMilliseconds + "ms\r\n" + e.Exception?.Message + e.Sql);
};
Fsql.Aop.CurdBefore = (s, e) => {
Fsql.Aop.CurdBefore = (s, e) =>
{
Console.WriteLine(e.Identifier + ": " + e.EntityType.FullName + ", " + e.Sql);
};
Fsql.Aop.CurdAfter = (s, e) => {
Fsql.Aop.CurdAfter = (s, e) =>
{
Console.WriteLine(e.Identifier + ": " + e.EntityType.FullName + " " + e.ElapsedMilliseconds + "ms, " + e.Sql);
};
@ -70,8 +74,10 @@ namespace dbcontext_01
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSwaggerGen(options => {
options.SwaggerDoc("v1", new Info {
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new Info
{
Version = "v1",
Title = "FreeSql.DbContext API"
});
@ -90,7 +96,8 @@ namespace dbcontext_01
var sql3 = Fsql.Update<Song>(1).Set(a => a.Create_time.Value.AddHours(1)).ToSql();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Console.OutputEncoding = Encoding.GetEncoding("GB2312");
Console.InputEncoding = Encoding.GetEncoding("GB2312");
@ -103,7 +110,8 @@ namespace dbcontext_01
app.UseMvc();
app.UseSwagger();
app.UseSwaggerUI(c => {
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "FreeSql.RESTful API V1");
});
}

View File

@ -2,17 +2,21 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using System;
namespace efcore_to_freesql.DBContexts {
namespace efcore_to_freesql.DBContexts
{
public class BaseDBContext : DbContext {
public class BaseDBContext : DbContext
{
public static IFreeSql Fsql { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder) {
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
Fsql.CodeFirst.ConfigEntity(modelBuilder.Model); //ͬ²½ÅäÖÃ
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite(@"Data Source=|DataDirectory|\document.db;Pooling=true;Max Pool Size=10");
}
}

View File

@ -1,13 +1,16 @@
using efcore_to_freesql.Entitys;
using Microsoft.EntityFrameworkCore;
namespace efcore_to_freesql.DBContexts {
namespace efcore_to_freesql.DBContexts
{
public class Topic1Context : BaseDBContext {
public class Topic1Context : BaseDBContext
{
public DbSet<Topic1> Topic1s { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder) {
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Topic1>().ToTable("topic1_sss").HasKey(a => a.Id);
modelBuilder.Entity<Topic1>().Property(a => a.Id).HasColumnName("topic1_id").ValueGeneratedOnAdd();

View File

@ -1,13 +1,16 @@
using efcore_to_freesql.Entitys;
using Microsoft.EntityFrameworkCore;
namespace efcore_to_freesql.DBContexts {
namespace efcore_to_freesql.DBContexts
{
public class Topic2Context : BaseDBContext {
public class Topic2Context : BaseDBContext
{
public DbSet<Topic2> Topic2s { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder) {
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Topic2>().ToTable("topic2_sss");
modelBuilder.Entity<Topic2>().Property(a => a.Id).HasColumnName("topic2_id");

View File

@ -1,6 +1,7 @@
using System;
namespace efcore_to_freesql.Entitys {
namespace efcore_to_freesql.Entitys
{
public class Topic1
{

View File

@ -2,7 +2,8 @@ using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace efcore_to_freesql.Entitys {
namespace efcore_to_freesql.Entitys
{
public class Topic2
{

View File

@ -6,20 +6,25 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
public static class CodeFirstExtensions {
public static class CodeFirstExtensions
{
public static void ConfigEntity(this ICodeFirst codeFirst, IModel efmodel) {
public static void ConfigEntity(this ICodeFirst codeFirst, IModel efmodel)
{
foreach (var type in efmodel.GetEntityTypes()) {
foreach (var type in efmodel.GetEntityTypes())
{
codeFirst.ConfigEntity(type.ClrType, a => {
codeFirst.ConfigEntity(type.ClrType, a =>
{
//表名
var relationalTableName = type.FindAnnotation("Relational:TableName");
if (relationalTableName != null)
a.Name(relationalTableName.Value?.ToString() ?? type.ClrType.Name);
foreach (var prop in type.GetProperties()) {
foreach (var prop in type.GetProperties())
{
var freeProp = a.Property(prop.Name);
@ -46,10 +51,12 @@ public static class CodeFirstExtensions {
//类型
var relationalColumnType = prop.FindAnnotation("Relational:ColumnType");
if (relationalColumnType != null) {
if (relationalColumnType != null)
{
var dbType = relationalColumnType.ToString();
if (!string.IsNullOrEmpty(dbType)) {
if (!string.IsNullOrEmpty(dbType))
{
var maxLength = prop.FindAnnotation("MaxLength");
if (maxLength != null)

View File

@ -39,10 +39,12 @@ namespace efcore_to_freesql
var sql22 = Fsql.Insert<Topic2>().AppendData(new Topic2()).ToSql();
//INSERT INTO "Topic2"("Id", "Title", "CreateTime") VALUES(@Id0, @Title0, @CreateTime0)
using (var db = new Topic1Context()) {
using (var db = new Topic1Context())
{
db.Topic1s.Add(new Topic1());
}
using (var db = new Topic2Context()) {
using (var db = new Topic2Context())
{
db.Topic2s.Add(new Topic2());
}

View File

@ -22,8 +22,10 @@ namespace orm_vs
//.UseConfigEntityFromDbFirst(true)
.Build();
static SqlSugarClient sugar {
get => new SqlSugarClient(new ConnectionConfig() {
static SqlSugarClient sugar
{
get => new SqlSugarClient(new ConnectionConfig()
{
//不欺负让连接池100个最小
//ConnectionString = "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Min Pool Size=20;Max Pool Size=20",
//DbType = DbType.SqlServer,
@ -34,21 +36,25 @@ namespace orm_vs
});
}
class SongContext : DbContext {
class SongContext : DbContext
{
public DbSet<Song> Songs { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//optionsBuilder.UseSqlServer(@"Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Min Pool Size=21;Max Pool Size=21");
optionsBuilder.UseMySql("Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Min Pool Size=21;Max Pool Size=21");
}
}
static void Main(string[] args) {
static void Main(string[] args)
{
fsql.CodeFirst.SyncStructure(typeof(Song), typeof(Song_tag), typeof(Tag));
//sugar.CodeFirst.InitTables(typeof(Song), typeof(Song_tag), typeof(Tag));
//sugar创建表失败SqlSugar.SqlSugarException: Sequence contains no elements
sugar.Aop.OnLogExecuted = (s, e) => {
sugar.Aop.OnLogExecuted = (s, e) =>
{
Trace.WriteLine(s);
};
//测试前清空数据
@ -124,7 +130,8 @@ namespace orm_vs
Console.ReadKey();
}
static void Select(StringBuilder sb, int forTime, int size) {
static void Select(StringBuilder sb, int forTime, int size)
{
Stopwatch sw = new Stopwatch();
sw.Restart();
for (var a = 0; a < forTime; a++)
@ -139,8 +146,10 @@ namespace orm_vs
sb.AppendLine($"SqlSugar Select {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms");
sw.Restart();
for (var a = 0; a < forTime; a++) {
using (var db = new SongContext()) {
for (var a = 0; a < forTime; a++)
{
using (var db = new SongContext())
{
db.Songs.Take(size).AsNoTracking().ToList();
}
}
@ -148,8 +157,10 @@ namespace orm_vs
sb.AppendLine($"EFCore Select {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms\r\n");
}
static void Insert(StringBuilder sb, int forTime, int size) {
var songs = Enumerable.Range(0, size).Select(a => new Song {
static void Insert(StringBuilder sb, int forTime, int size)
{
var songs = Enumerable.Range(0, size).Select(a => new Song
{
Create_time = DateTime.Now,
Is_deleted = false,
Title = $"Insert_{a}",
@ -159,7 +170,8 @@ namespace orm_vs
//预热
fsql.Insert(songs.First()).ExecuteAffrows();
sugar.Insertable(songs.First()).ExecuteCommand();
using (var db = new SongContext()) {
using (var db = new SongContext())
{
//db.Configuration.AutoDetectChangesEnabled = false;
db.Songs.AddRange(songs.First());
db.SaveChanges();
@ -167,7 +179,8 @@ namespace orm_vs
Stopwatch sw = new Stopwatch();
sw.Restart();
for (var a = 0; a < forTime; a++) {
for (var a = 0; a < forTime; a++)
{
fsql.Insert(songs).ExecuteAffrows();
//using (var db = new FreeSongContext()) {
// //db.Configuration.AutoDetectChangesEnabled = false;
@ -180,19 +193,24 @@ namespace orm_vs
sw.Restart();
Exception sugarEx = null;
try {
try
{
for (var a = 0; a < forTime; a++)
sugar.Insertable(songs.ToArray()).ExecuteCommand();
} catch (Exception ex) {
}
catch (Exception ex)
{
sugarEx = ex;
}
sw.Stop();
sb.AppendLine($"SqlSugar Insert {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms" + (sugarEx != null ? $"成绩无效,错误:{sugarEx.Message}" : ""));
sw.Restart();
for (var a = 0; a < forTime; a++) {
for (var a = 0; a < forTime; a++)
{
using (var db = new SongContext()) {
using (var db = new SongContext())
{
//db.Configuration.AutoDetectChangesEnabled = false;
db.Songs.AddRange(songs.ToArray());
db.SaveChanges();
@ -202,12 +220,14 @@ namespace orm_vs
sb.AppendLine($"EFCore Insert {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms\r\n");
}
static void Update(StringBuilder sb, int forTime, int size) {
static void Update(StringBuilder sb, int forTime, int size)
{
Stopwatch sw = new Stopwatch();
var songs = fsql.Select<Song>().Limit(size).ToList();
sw.Restart();
for (var a = 0; a < forTime; a++) {
for (var a = 0; a < forTime; a++)
{
fsql.Update<Song>().SetSource(songs).ExecuteAffrows();
}
sw.Stop();
@ -216,22 +236,28 @@ namespace orm_vs
songs = sugar.Queryable<Song>().Take(size).ToList();
sw.Restart();
Exception sugarEx = null;
try {
try
{
for (var a = 0; a < forTime; a++)
sugar.Updateable(songs).ExecuteCommand();
} catch (Exception ex) {
}
catch (Exception ex)
{
sugarEx = ex;
}
sw.Stop();
sb.AppendLine($"SqlSugar Update {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms" + (sugarEx != null ? $"成绩无效,错误:{sugarEx.Message}" : ""));
using (var db = new SongContext()) {
using (var db = new SongContext())
{
songs = db.Songs.Take(size).AsNoTracking().ToList();
}
sw.Restart();
for (var a = 0; a < forTime; a++) {
for (var a = 0; a < forTime; a++)
{
using (var db = new SongContext()) {
using (var db = new SongContext())
{
//db.Configuration.AutoDetectChangesEnabled = false;
db.Songs.UpdateRange(songs.ToArray());
db.SaveChanges();
@ -245,7 +271,8 @@ namespace orm_vs
[FreeSql.DataAnnotations.Table(Name = "freesql_song")]
[SugarTable("sugar_song")]
[Table("efcore_song")]
public class Song {
public class Song
{
[FreeSql.DataAnnotations.Column(IsIdentity = true)]
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
[Key]
@ -263,7 +290,8 @@ namespace orm_vs
[FreeSql.DataAnnotations.Table(Name = "freesql_song_tag")]
[SugarTable("sugar_song_tag")]
[Table("efcore_song_tag")]
public class Song_tag {
public class Song_tag
{
public int Song_id { get; set; }
[SugarColumn(IsIgnore = true)]
[NotMapped]
@ -277,7 +305,8 @@ namespace orm_vs
[FreeSql.DataAnnotations.Table(Name = "freesql_tag")]
[SugarTable("sugar_tag")]
[Table("efcore_tag")]
public class Tag {
public class Tag
{
[FreeSql.DataAnnotations.Column(IsIdentity = true)]
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
[Key]

View File

@ -6,19 +6,24 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace restful.Controllers {
namespace restful.Controllers
{
public class SongRepository : GuidRepository<Song> {
public SongRepository(IFreeSql fsql) : base(fsql) {
public class SongRepository : GuidRepository<Song>
{
public SongRepository(IFreeSql fsql) : base(fsql)
{
}
}
[Route("restapi/[controller]")]
public class SongsController : Controller {
public class SongsController : Controller
{
BaseRepository<Song, int> _songRepository;
public class xxxx {
public class xxxx
{
public int Id { get; set; }
public bool IsDeleted { get; set; }
@ -38,7 +43,8 @@ namespace restful.Controllers {
IReadOnlyRepository<Song> repos311, IReadOnlyRepository<Song, int> repos411,
SongRepository reposSong
) {
)
{
_songRepository = repos4;
//test code
@ -53,37 +59,44 @@ namespace restful.Controllers {
Console.WriteLine(repos2.Select.ToSql());
Console.WriteLine(repos21.Select.ToSql());
using (reposSong.DataFilter.DisableAll()) {
using (reposSong.DataFilter.DisableAll())
{
Console.WriteLine(reposSong.Select.ToSql());
}
}
[HttpGet]
public Task<List<Song>> GetItems([FromQuery] string key, [FromQuery] int page = 1, [FromQuery] int limit = 20) {
public Task<List<Song>> GetItems([FromQuery] string key, [FromQuery] int page = 1, [FromQuery] int limit = 20)
{
return _songRepository.Select.WhereIf(!string.IsNullOrEmpty(key), a => a.Title.Contains(key)).Page(page, limit).ToListAsync();
}
[HttpGet("{id}")]
public Task<Song> GetItem([FromRoute] int id) {
public Task<Song> GetItem([FromRoute] int id)
{
return _songRepository.FindAsync(id);
}
public class ModelSong {
public class ModelSong
{
public string title { get; set; }
}
[HttpPost, ProducesResponseType(201)]
public Task<Song> Create([FromBody] ModelSong model) {
public Task<Song> Create([FromBody] ModelSong model)
{
return _songRepository.InsertAsync(new Song { Title = model.title });
}
[HttpPut("{id}")]
public Task Update([FromRoute] int id, [FromBody] ModelSong model) {
public Task Update([FromRoute] int id, [FromBody] ModelSong model)
{
return _songRepository.UpdateAsync(new Song { Id = id, Title = model.title });
}
[HttpPatch("{id}")]
async public Task<Song> UpdateDiy([FromRoute] int id, [FromForm] string title) {
async public Task<Song> UpdateDiy([FromRoute] int id, [FromForm] string title)
{
var up = _songRepository.UpdateDiy.Where(a => a.Id == id);
if (!string.IsNullOrEmpty(title)) up.Set(a => a.Title, title);
var ret = await up.ExecuteUpdatedAsync();
@ -91,7 +104,8 @@ namespace restful.Controllers {
}
[HttpDelete("{id}"), ProducesResponseType(204)]
public Task Delete([FromRoute] int id) {
public Task Delete([FromRoute] int id)
{
return _songRepository.DeleteAsync(a => a.Id == id);
}
}

View File

@ -1,8 +1,10 @@
using FreeSql.DataAnnotations;
using repository_01;
namespace restful.Entitys {
public class Song {
namespace restful.Entitys
{
public class Song
{
[Column(IsIdentity = true)]
public int Id { get; set; }

View File

@ -13,24 +13,29 @@ using System.Diagnostics;
using System.Linq;
using System.Text;
namespace repository_01 {
namespace repository_01
{
/// <summary>
/// 用户密码信息
/// </summary>
public class Sys1UserLogOn {
public class Sys1UserLogOn
{
[Column(IsPrimary = true, Name = "Id")]
public Guid UserLogOnId { get; set; }
public virtual Sys1User User { get; set; }
}
public class Sys1User {
public class Sys1User
{
[Column(IsPrimary = true, Name = "Id")]
public Guid UserId { get; set; }
public virtual Sys1UserLogOn UserLogOn { get; set; }
}
public class Startup {
public Startup(IConfiguration configuration, ILoggerFactory loggerFactory) {
public class Startup
{
public Startup(IConfiguration configuration, ILoggerFactory loggerFactory)
{
Configuration = configuration;
Fsql = new FreeSql.FreeSqlBuilder()
@ -51,13 +56,16 @@ namespace repository_01 {
public IConfiguration Configuration { get; }
public static IFreeSql Fsql { get; private set; }
public void ConfigureServices(IServiceCollection services) {
public void ConfigureServices(IServiceCollection services)
{
//services.AddTransient(s => s.)
services.AddMvc();
services.AddSwaggerGen(options => {
options.SwaggerDoc("v1", new Info {
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new Info
{
Version = "v1",
Title = "FreeSql.RESTful API"
});
@ -66,14 +74,16 @@ namespace repository_01 {
services.AddSingleton<IFreeSql>(Fsql);
services.AddFreeRepository(filter => {
services.AddFreeRepository(filter =>
{
filter
//.Apply<Song>("test", a => a.Title == DateTime.Now.ToString() + System.Threading.Thread.CurrentThread.ManagedThreadId)
.Apply<ISoftDelete>("softdelete", a => a.IsDeleted == false);
}, this.GetType().Assembly);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Console.OutputEncoding = Encoding.GetEncoding("GB2312");
Console.InputEncoding = Encoding.GetEncoding("GB2312");
@ -86,13 +96,15 @@ namespace repository_01 {
app.UseMvc();
app.UseSwagger();
app.UseSwaggerUI(c => {
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "FreeSql.RESTful API V1");
});
}
}
public interface ISoftDelete {
public interface ISoftDelete
{
bool IsDeleted { get; set; }
}
}

View File

@ -4,46 +4,55 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace restful.Controllers {
namespace restful.Controllers
{
[Route("restapi/[controller]")]
public class SongsController : Controller {
public class SongsController : Controller
{
IFreeSql _fsql;
public SongsController(IFreeSql fsql) {
public SongsController(IFreeSql fsql)
{
_fsql = fsql;
}
[HttpGet]
public Task<List<Song>> GetItems([FromQuery] string key, [FromQuery] int page = 1, [FromQuery] int limit = 20) {
public Task<List<Song>> GetItems([FromQuery] string key, [FromQuery] int page = 1, [FromQuery] int limit = 20)
{
return _fsql.Select<Song>().WhereIf(!string.IsNullOrEmpty(key), a => a.Title.Contains(key)).Page(page, limit).ToListAsync();
}
[HttpGet("{id}")]
public Task<Song> GetItem([FromRoute] int id) {
public Task<Song> GetItem([FromRoute] int id)
{
return _fsql.Select<Song>().Where(a => a.Id == id).ToOneAsync();
}
public class ModelSong {
public class ModelSong
{
public string title { get; set; }
}
[HttpPost, ProducesResponseType(201)]
async public Task<Song> Create([FromBody] ModelSong model) {
async public Task<Song> Create([FromBody] ModelSong model)
{
var ret = await _fsql.Insert<Song>().AppendData(new Song { Title = model.title }).ExecuteInsertedAsync();
return ret.FirstOrDefault();
}
[HttpPut("{id}")]
async public Task<Song> Update([FromRoute] int id, [FromBody] ModelSong model) {
async public Task<Song> Update([FromRoute] int id, [FromBody] ModelSong model)
{
var ret = await _fsql.Update<Song>().SetSource(new Song { Id = id, Title = model.title }).ExecuteUpdatedAsync();
return ret.FirstOrDefault();
}
[HttpPatch("{id}")]
async public Task<Song> UpdateDiy([FromRoute] int id, [FromForm] string title) {
async public Task<Song> UpdateDiy([FromRoute] int id, [FromForm] string title)
{
var up = _fsql.Update<Song>().Where(a => a.Id == id);
if (!string.IsNullOrEmpty(title)) up.Set(a => a.Title, title);
var ret = await up.ExecuteUpdatedAsync();
@ -51,7 +60,8 @@ namespace restful.Controllers {
}
[HttpDelete("{id}"), ProducesResponseType(204)]
async public Task<Song> Delete([FromRoute] int id) {
async public Task<Song> Delete([FromRoute] int id)
{
var ret = await _fsql.Delete<Song>().Where(a => a.Id == id).ExecuteDeletedAsync();
return ret.FirstOrDefault();
}

View File

@ -1,7 +1,9 @@
using FreeSql.DataAnnotations;
namespace restful.Entitys {
public class Song {
namespace restful.Entitys
{
public class Song
{
[Column(IsIdentity = true)]
public int Id { get; set; }

View File

@ -7,9 +7,12 @@ using Swashbuckle.AspNetCore.Swagger;
using System;
using System.Text;
namespace restful {
public class Startup {
public Startup(IConfiguration configuration, ILoggerFactory loggerFactory) {
namespace restful
{
public class Startup
{
public Startup(IConfiguration configuration, ILoggerFactory loggerFactory)
{
Configuration = configuration;
Fsql = new FreeSql.FreeSqlBuilder()
@ -17,8 +20,10 @@ namespace restful {
.UseAutoSyncStructure(true)
.Build();
Fsql.Aop.CurdAfter = (s, e) => {
if (e.ElapsedMilliseconds > 200) {
Fsql.Aop.CurdAfter = (s, e) =>
{
if (e.ElapsedMilliseconds > 200)
{
//记录日志
//发送短信给负责人
}
@ -33,12 +38,15 @@ namespace restful {
public IConfiguration Configuration { get; }
public IFreeSql Fsql { get; }
public void ConfigureServices(IServiceCollection services) {
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IFreeSql>(Fsql);
services.AddMvc();
services.AddSwaggerGen(options => {
options.SwaggerDoc("v1", new Info {
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new Info
{
Version = "v1",
Title = "FreeSql.RESTful API"
});
@ -46,7 +54,8 @@ namespace restful {
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Console.OutputEncoding = Encoding.GetEncoding("GB2312");
Console.InputEncoding = Encoding.GetEncoding("GB2312");
@ -59,7 +68,8 @@ namespace restful {
app.UseMvc();
app.UseSwagger();
app.UseSwaggerUI(c => {
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "FreeSql.RESTful API V1");
});
}

View File

@ -5,12 +5,15 @@ using System.Collections.Generic;
using System.Reflection;
using System.Text;
namespace FreeSql.Extensions.LazyLoading {
namespace FreeSql.Extensions.LazyLoading
{
public class LazyLoadingComplier {
public class LazyLoadingComplier
{
#if ns20
internal static Lazy<CSScriptLib.RoslynEvaluator> _compiler = new Lazy<CSScriptLib.RoslynEvaluator>(() => {
internal static Lazy<CSScriptLib.RoslynEvaluator> _compiler = new Lazy<CSScriptLib.RoslynEvaluator>(() =>
{
//var dlls = Directory.GetFiles(Directory.GetParent(Type.GetType("IFreeSql, FreeSql").Assembly.Location).FullName, "*.dll");
var compiler = new CSScriptLib.RoslynEvaluator();
compiler.DisableReferencingFromCode = false;
@ -26,7 +29,8 @@ namespace FreeSql.Extensions.LazyLoading {
return compiler;
});
public static Assembly CompileCode(string cscode) {
public static Assembly CompileCode(string cscode)
{
return _compiler.Value.CompileCode(cscode);
}
#else

View File

@ -5,8 +5,10 @@ using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace FreeSql {
public abstract partial class DbContext : IDisposable {
namespace FreeSql
{
public abstract partial class DbContext : IDisposable
{
internal IFreeSql _orm;
internal IFreeSql _fsql => _orm ?? throw new ArgumentNullException("请在 OnConfiguring 或 AddFreeDbContext 中配置 UseFreeSql");
@ -20,8 +22,10 @@ namespace FreeSql {
public IUnitOfWork UnitOfWork => _uow;
DbContextOptions _options;
internal DbContextOptions Options {
get {
internal DbContextOptions Options
{
get
{
if (_options != null) return _options;
if (FreeSqlDbContextExtenssions._dicSetDbContextOptions.TryGetValue(Orm, out _options)) return _options;
_options = new DbContextOptions();
@ -30,7 +34,8 @@ namespace FreeSql {
}
static ConcurrentDictionary<Type, PropertyInfo[]> _dicGetDbSetProps = new ConcurrentDictionary<Type, PropertyInfo[]>();
protected DbContext() {
protected DbContext()
{
var builder = new DbContextOptionsBuilder();
OnConfiguring(builder);
@ -39,13 +44,15 @@ namespace FreeSql {
if (_orm != null) InitPropSets();
}
internal void InitPropSets() {
internal void InitPropSets()
{
var props = _dicGetDbSetProps.GetOrAdd(this.GetType(), tp =>
tp.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)
.Where(a => a.PropertyType.IsGenericType &&
a.PropertyType == typeof(DbSet<>).MakeGenericType(a.PropertyType.GenericTypeArguments[0])).ToArray());
foreach (var prop in props) {
foreach (var prop in props)
{
var set = this.Set(prop.PropertyType.GenericTypeArguments[0]);
prop.SetValue(this, set);
@ -53,13 +60,15 @@ namespace FreeSql {
}
}
protected virtual void OnConfiguring(DbContextOptionsBuilder builder) {
protected virtual void OnConfiguring(DbContextOptionsBuilder builder)
{
}
protected Dictionary<Type, IDbSet> _dicSet = new Dictionary<Type, IDbSet>();
public DbSet<TEntity> Set<TEntity>() where TEntity : class => this.Set(typeof(TEntity)) as DbSet<TEntity>;
public virtual IDbSet Set(Type entityType) {
public virtual IDbSet Set(Type entityType)
{
if (_dicSet.ContainsKey(entityType)) return _dicSet[entityType];
var sd = Activator.CreateInstance(typeof(DbContextDbSet<>).MakeGenericType(entityType), this) as IDbSet;
if (entityType != typeof(object)) _dicSet.Add(entityType, sd);
@ -113,7 +122,8 @@ namespace FreeSql {
public void AttachRange<TEntity>(IEnumerable<TEntity> data) where TEntity : class => this.Set<TEntity>().AttachRange(data);
#endregion
internal class ExecCommandInfo {
internal class ExecCommandInfo
{
public ExecCommandInfoType actionType { get; set; }
public IDbSet dbSet { get; set; }
public Type stateType { get; set; }
@ -123,29 +133,37 @@ namespace FreeSql {
Queue<ExecCommandInfo> _actions = new Queue<ExecCommandInfo>();
internal int _affrows = 0;
internal void EnqueueAction(ExecCommandInfoType actionType, IDbSet dbSet, Type stateType, object state) {
internal void EnqueueAction(ExecCommandInfoType actionType, IDbSet dbSet, Type stateType, object state)
{
_actions.Enqueue(new ExecCommandInfo { actionType = actionType, dbSet = dbSet, stateType = stateType, state = state });
}
~DbContext() {
~DbContext()
{
this.Dispose();
}
bool _isdisposed = false;
public void Dispose() {
public void Dispose()
{
if (_isdisposed) return;
try {
try
{
_actions.Clear();
foreach (var set in _dicSet)
try {
try
{
set.Value.Dispose();
} catch { }
}
catch { }
_dicSet.Clear();
AllSets.Clear();
_uow?.Rollback();
} finally {
}
finally
{
_isdisposed = true;
GC.SuppressFinalize(this);
}

View File

@ -5,10 +5,13 @@ using System.Reflection;
using System.Linq.Expressions;
using System.Threading.Tasks;
namespace FreeSql {
partial class DbContext {
namespace FreeSql
{
partial class DbContext
{
async public virtual Task<int> SaveChangesAsync() {
async public virtual Task<int> SaveChangesAsync()
{
await ExecCommandAsync();
_uow?.Commit();
var ret = _affrows;
@ -17,7 +20,8 @@ namespace FreeSql {
}
static Dictionary<Type, Dictionary<string, Func<object, object[], Task<int>>>> _dicExecCommandDbContextBetchAsync = new Dictionary<Type, Dictionary<string, Func<object, object[], Task<int>>>>();
async internal Task ExecCommandAsync() {
async internal Task ExecCommandAsync()
{
if (isExecCommanding) return;
if (_actions.Any() == false) return;
isExecCommanding = true;
@ -25,10 +29,12 @@ namespace FreeSql {
ExecCommandInfo oldinfo = null;
var states = new List<object>();
Func<string, Task<int>> dbContextBetch = methodName => {
Func<string, Task<int>> dbContextBetch = methodName =>
{
if (_dicExecCommandDbContextBetchAsync.TryGetValue(oldinfo.stateType, out var trydic) == false)
trydic = new Dictionary<string, Func<object, object[], Task<int>>>();
if (trydic.TryGetValue(methodName, out var tryfunc) == false) {
if (trydic.TryGetValue(methodName, out var tryfunc) == false)
{
var arrType = oldinfo.stateType.MakeArrayType();
var dbsetType = oldinfo.dbSet.GetType().BaseType;
var dbsetTypeMethod = dbsetType.GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { arrType }, null);
@ -47,28 +53,34 @@ namespace FreeSql {
}
return tryfunc(oldinfo.dbSet, states.ToArray());
};
Func<Task> funcDelete = async () => {
Func<Task> funcDelete = async () =>
{
_affrows += await dbContextBetch("DbContextBetchRemoveAsync");
states.Clear();
};
Func<Task> funcInsert = async () => {
Func<Task> funcInsert = async () =>
{
_affrows += await dbContextBetch("DbContextBetchAddAsync");
states.Clear();
};
Func<bool, Task> funcUpdate = async (isLiveUpdate) => {
Func<bool, Task> funcUpdate = async (isLiveUpdate) =>
{
var affrows = 0;
if (isLiveUpdate) affrows = await dbContextBetch("DbContextBetchUpdateNowAsync");
else affrows = await dbContextBetch("DbContextBetchUpdateAsync");
if (affrows == -999) { //最后一个元素已被删除
if (affrows == -999)
{ //最后一个元素已被删除
states.RemoveAt(states.Count - 1);
return;
}
if (affrows == -998 || affrows == -997) { //没有执行更新
if (affrows == -998 || affrows == -997)
{ //没有执行更新
var laststate = states[states.Count - 1];
states.Clear();
if (affrows == -997) states.Add(laststate); //保留最后一个
}
if (affrows > 0) {
if (affrows > 0)
{
_affrows += affrows;
var islastNotUpdated = states.Count != affrows;
var laststate = states[states.Count - 1];
@ -77,22 +89,26 @@ namespace FreeSql {
}
};
while (_actions.Any() || states.Any()) {
while (_actions.Any() || states.Any())
{
var info = _actions.Any() ? _actions.Dequeue() : null;
if (oldinfo == null) oldinfo = info;
var isLiveUpdate = false;
if (_actions.Any() == false && states.Any() ||
info != null && oldinfo.actionType != info.actionType ||
info != null && oldinfo.stateType != info.stateType) {
info != null && oldinfo.stateType != info.stateType)
{
if (info != null && oldinfo.actionType == info.actionType && oldinfo.stateType == info.stateType) {
if (info != null && oldinfo.actionType == info.actionType && oldinfo.stateType == info.stateType)
{
//最后一个,合起来发送
states.Add(info.state);
info = null;
}
switch (oldinfo.actionType) {
switch (oldinfo.actionType)
{
case ExecCommandInfoType.Insert:
await funcInsert();
break;
@ -103,12 +119,14 @@ namespace FreeSql {
isLiveUpdate = true;
}
if (isLiveUpdate || oldinfo.actionType == ExecCommandInfoType.Update) {
if (isLiveUpdate || oldinfo.actionType == ExecCommandInfoType.Update)
{
if (states.Any())
await funcUpdate(isLiveUpdate);
}
if (info != null) {
if (info != null)
{
states.Add(info.state);
oldinfo = info;
}

View File

@ -1,6 +1,8 @@

namespace FreeSql {
public class DbContextOptions {
namespace FreeSql
{
public class DbContextOptions
{
/// <summary>
/// 是否开启一对多,联级保存功能

View File

@ -1,11 +1,14 @@

namespace FreeSql {
public class DbContextOptionsBuilder {
namespace FreeSql
{
public class DbContextOptionsBuilder
{
internal IFreeSql _fsql;
public DbContextOptionsBuilder UseFreeSql(IFreeSql orm) {
public DbContextOptionsBuilder UseFreeSql(IFreeSql orm)
{
_fsql = orm;
return this;
}

View File

@ -4,10 +4,13 @@ using System.Linq;
using System.Reflection;
using System.Linq.Expressions;
namespace FreeSql {
partial class DbContext {
namespace FreeSql
{
partial class DbContext
{
public virtual int SaveChanges() {
public virtual int SaveChanges()
{
ExecCommand();
_uow?.Commit();
var ret = _affrows;
@ -17,7 +20,8 @@ namespace FreeSql {
static Dictionary<Type, Dictionary<string, Func<object, object[], int>>> _dicExecCommandDbContextBetch = new Dictionary<Type, Dictionary<string, Func<object, object[], int>>>();
bool isExecCommanding = false;
internal void ExecCommand() {
internal void ExecCommand()
{
if (isExecCommanding) return;
if (_actions.Any() == false) return;
isExecCommanding = true;
@ -25,10 +29,12 @@ namespace FreeSql {
ExecCommandInfo oldinfo = null;
var states = new List<object>();
Func<string, int> dbContextBetch = methodName => {
Func<string, int> dbContextBetch = methodName =>
{
if (_dicExecCommandDbContextBetch.TryGetValue(oldinfo.stateType, out var trydic) == false)
trydic = new Dictionary<string, Func<object, object[], int>>();
if (trydic.TryGetValue(methodName, out var tryfunc) == false) {
if (trydic.TryGetValue(methodName, out var tryfunc) == false)
{
var arrType = oldinfo.stateType.MakeArrayType();
var dbsetType = oldinfo.dbSet.GetType().BaseType;
var dbsetTypeMethod = dbsetType.GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { arrType }, null);
@ -47,28 +53,34 @@ namespace FreeSql {
}
return tryfunc(oldinfo.dbSet, states.ToArray());
};
Action funcDelete = () => {
Action funcDelete = () =>
{
_affrows += dbContextBetch("DbContextBetchRemove");
states.Clear();
};
Action funcInsert = () => {
Action funcInsert = () =>
{
_affrows += dbContextBetch("DbContextBetchAdd");
states.Clear();
};
Action<bool> funcUpdate = isLiveUpdate => {
Action<bool> funcUpdate = isLiveUpdate =>
{
var affrows = 0;
if (isLiveUpdate) affrows = dbContextBetch("DbContextBetchUpdateNow");
else affrows = dbContextBetch("DbContextBetchUpdate");
if (affrows == -999) { //最后一个元素已被删除
if (affrows == -999)
{ //最后一个元素已被删除
states.RemoveAt(states.Count - 1);
return;
}
if (affrows == -998 || affrows == -997) { //没有执行更新
if (affrows == -998 || affrows == -997)
{ //没有执行更新
var laststate = states[states.Count - 1];
states.Clear();
if (affrows == -997) states.Add(laststate); //保留最后一个
}
if (affrows > 0) {
if (affrows > 0)
{
_affrows += affrows;
var islastNotUpdated = states.Count != affrows;
var laststate = states[states.Count - 1];
@ -77,22 +89,26 @@ namespace FreeSql {
}
};
while (_actions.Any() || states.Any()) {
while (_actions.Any() || states.Any())
{
var info = _actions.Any() ? _actions.Dequeue() : null;
if (oldinfo == null) oldinfo = info;
var isLiveUpdate = false;
if (_actions.Any() == false && states.Any() ||
info != null && oldinfo.actionType != info.actionType ||
info != null && oldinfo.stateType != info.stateType) {
info != null && oldinfo.stateType != info.stateType)
{
if (info != null && oldinfo.actionType == info.actionType && oldinfo.stateType == info.stateType) {
if (info != null && oldinfo.actionType == info.actionType && oldinfo.stateType == info.stateType)
{
//最后一个,合起来发送
states.Add(info.state);
info = null;
}
switch (oldinfo.actionType) {
switch (oldinfo.actionType)
{
case ExecCommandInfoType.Insert:
funcInsert();
break;
@ -103,12 +119,14 @@ namespace FreeSql {
isLiveUpdate = true;
}
if (isLiveUpdate || oldinfo.actionType == ExecCommandInfoType.Update) {
if (isLiveUpdate || oldinfo.actionType == ExecCommandInfoType.Update)
{
if (states.Any())
funcUpdate(isLiveUpdate);
}
if (info != null) {
if (info != null)
{
states.Add(info.state);
oldinfo = info;
}

View File

@ -1,9 +1,12 @@

namespace FreeSql {
public class FreeContext : DbContext {
namespace FreeSql
{
public class FreeContext : DbContext
{
public FreeContext(IFreeSql orm) {
public FreeContext(IFreeSql orm)
{
_orm = orm;
}
}

View File

@ -8,41 +8,52 @@ using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace FreeSql {
namespace FreeSql
{
internal class DbContextDbSet<TEntity> : DbSet<TEntity> where TEntity : class {
internal class DbContextDbSet<TEntity> : DbSet<TEntity> where TEntity : class
{
public DbContextDbSet(DbContext ctx) {
public DbContextDbSet(DbContext ctx)
{
_ctx = ctx;
_uow = ctx._uow;
_fsql = ctx._fsql;
}
}
public interface IDbSet : IDisposable {
public interface IDbSet : IDisposable
{
Type EntityType { get; }
}
public abstract partial class DbSet<TEntity> : IDbSet where TEntity : class {
public abstract partial class DbSet<TEntity> : IDbSet where TEntity : class
{
internal DbContext _ctx;
internal IUnitOfWork _uow;
internal IFreeSql _fsql;
protected virtual ISelect<TEntity> OrmSelect(object dywhere) {
protected virtual ISelect<TEntity> OrmSelect(object dywhere)
{
DbContextExecCommand(); //查询前先提交,否则会出脏读
return _fsql.Select<TEntity>().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction(false)).TrackToList(TrackToList).WhereDynamic(dywhere);
}
~DbSet() {
~DbSet()
{
this.Dispose();
}
bool _isdisposed = false;
public void Dispose() {
public void Dispose()
{
if (_isdisposed) return;
try {
try
{
this._dicUpdateTimes.Clear();
this._states.Clear();
} finally {
}
finally
{
_isdisposed = true;
GC.SuppressFinalize(this);
}
@ -55,20 +66,25 @@ namespace FreeSql {
protected virtual IUpdate<TEntity> OrmUpdate(IEnumerable<TEntity> entitys) => _fsql.Update<TEntity>().AsType(_entityType).SetSource(entitys).WithTransaction(_uow?.GetOrBeginTransaction());
protected virtual IDelete<TEntity> OrmDelete(object dywhere) => _fsql.Delete<TEntity>().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction()).WhereDynamic(dywhere);
internal void EnqueueToDbContext(DbContext.ExecCommandInfoType actionType, EntityState state) {
internal void EnqueueToDbContext(DbContext.ExecCommandInfoType actionType, EntityState state)
{
_ctx.EnqueueAction(actionType, this, typeof(EntityState), state);
}
internal void IncrAffrows(int affrows) {
internal void IncrAffrows(int affrows)
{
_ctx._affrows += affrows;
}
internal void TrackToList(object list) {
internal void TrackToList(object list)
{
if (list == null) return;
var ls = list as IList<TEntity>;
if (ls == null) {
if (ls == null)
{
var ie = list as IEnumerable;
if (ie == null) return;
foreach (var item in ie) {
foreach (var item in ie)
{
if (item == null) return;
var itemType = item.GetType();
if (itemType == typeof(object)) return;
@ -80,10 +96,12 @@ namespace FreeSql {
return;
}
foreach (var item in ls) {
foreach (var item in ls)
{
var key = _fsql.GetEntityKeyString(_entityType, item, false);
if (key == null) continue;
_states.AddOrUpdate(key, k => CreateEntityState(item), (k, ov) => {
_states.AddOrUpdate(key, k => CreateEntityState(item), (k, ov) =>
{
_fsql.MapEntityValue(_entityType, item, ov.Value);
ov.Time = DateTime.Now;
return ov;
@ -109,7 +127,8 @@ namespace FreeSql {
/// </summary>
/// <param name="entityType"></param>
/// <returns></returns>
public void AsType(Type entityType) {
public void AsType(Type entityType)
{
if (entityType == typeof(object)) throw new Exception("ISelect.AsType 参数不支持指定为 object");
if (entityType == _entityType) return;
var newtb = _fsql.CodeFirst.GetTableByEntity(entityType);
@ -118,8 +137,10 @@ namespace FreeSql {
_tableIdentitysPriv = null;
}
public class EntityState {
public EntityState(TEntity value, string key) {
public class EntityState
{
public EntityState(TEntity value, string key)
{
this.Value = value;
this.Key = key;
this.Time = DateTime.Now;
@ -134,14 +155,17 @@ namespace FreeSql {
/// </summary>
/// <param name="data"></param>
public void Attach(TEntity data) => AttachRange(new[] { data });
public void AttachRange(IEnumerable<TEntity> data) {
public void AttachRange(IEnumerable<TEntity> data)
{
if (data == null || data.Any() == false) return;
if (_table.Primarys.Any() == false) throw new Exception($"不可附加,实体没有主键:{_fsql.GetEntityString(_entityType, data.First())}");
foreach (var item in data) {
foreach (var item in data)
{
var key = _fsql.GetEntityKeyString(_entityType, item, false);
if (string.IsNullOrEmpty(key)) throw new Exception($"不可附加,未设置主键的值:{_fsql.GetEntityString(_entityType, item)}");
_states.AddOrUpdate(key, k => CreateEntityState(item), (k, ov) => {
_states.AddOrUpdate(key, k => CreateEntityState(item), (k, ov) =>
{
_fsql.MapEntityValue(_entityType, item, ov.Value);
ov.Time = DateTime.Now;
return ov;
@ -151,27 +175,32 @@ namespace FreeSql {
/// <summary>
/// 清空状态数据
/// </summary>
public void FlushState() {
public void FlushState()
{
_states.Clear();
}
#region Utils
EntityState CreateEntityState(TEntity data) {
EntityState CreateEntityState(TEntity data)
{
if (data == null) throw new ArgumentNullException(nameof(data));
var key = _fsql.GetEntityKeyString(_entityType, data, false);
var state = new EntityState((TEntity)Activator.CreateInstance(_entityType), key);
_fsql.MapEntityValue(_entityType, data, state.Value);
return state;
}
bool? ExistsInStates(TEntity data) {
bool? ExistsInStates(TEntity data)
{
if (data == null) throw new ArgumentNullException(nameof(data));
var key = _fsql.GetEntityKeyString(_entityType, data, false);
if (string.IsNullOrEmpty(key)) return null;
return _states.ContainsKey(key);
}
bool CanAdd(IEnumerable<TEntity> data, bool isThrow) {
if (data == null) {
bool CanAdd(IEnumerable<TEntity> data, bool isThrow)
{
if (data == null)
{
if (isThrow) throw new ArgumentNullException(nameof(data));
return false;
}
@ -179,37 +208,47 @@ namespace FreeSql {
foreach (var s in data) if (CanAdd(s, isThrow) == false) return false;
return true;
}
bool CanAdd(TEntity data, bool isThrow) {
if (data == null) {
bool CanAdd(TEntity data, bool isThrow)
{
if (data == null)
{
if (isThrow) throw new ArgumentNullException(nameof(data));
return false;
}
if (_table.Primarys.Any() == false) {
if (_table.Primarys.Any() == false)
{
if (isThrow) throw new Exception($"不可添加,实体没有主键:{_fsql.GetEntityString(_entityType, data)}");
return false;
}
var key = _fsql.GetEntityKeyString(_entityType, data, true);
if (string.IsNullOrEmpty(key)) {
switch (_fsql.Ado.DataType) {
if (string.IsNullOrEmpty(key))
{
switch (_fsql.Ado.DataType)
{
case DataType.SqlServer:
case DataType.PostgreSQL:
return true;
case DataType.MySql:
case DataType.Oracle:
case DataType.Sqlite:
if (_tableIdentitys.Length == 1 && _table.Primarys.Length == 1) {
if (_tableIdentitys.Length == 1 && _table.Primarys.Length == 1)
{
return true;
}
if (isThrow) throw new Exception($"不可添加,未设置主键的值:{_fsql.GetEntityString(_entityType, data)}");
return false;
}
} else {
if (_states.ContainsKey(key)) {
}
else
{
if (_states.ContainsKey(key))
{
if (isThrow) throw new Exception($"不可添加,已存在于状态管理:{_fsql.GetEntityString(_entityType, data)}");
return false;
}
var idval = _fsql.GetEntityIdentityValueWithPrimary(_entityType, data);
if (idval > 0) {
if (idval > 0)
{
if (isThrow) throw new Exception($"不可添加,自增属性有值:{_fsql.GetEntityString(_entityType, data)}");
return false;
}
@ -217,8 +256,10 @@ namespace FreeSql {
return true;
}
bool CanUpdate(IEnumerable<TEntity> data, bool isThrow) {
if (data == null) {
bool CanUpdate(IEnumerable<TEntity> data, bool isThrow)
{
if (data == null)
{
if (isThrow) throw new ArgumentNullException(nameof(data));
return false;
}
@ -226,29 +267,36 @@ namespace FreeSql {
foreach (var s in data) if (CanUpdate(s, isThrow) == false) return false;
return true;
}
bool CanUpdate(TEntity data, bool isThrow) {
if (data == null) {
bool CanUpdate(TEntity data, bool isThrow)
{
if (data == null)
{
if (isThrow) throw new ArgumentNullException(nameof(data));
return false;
}
if (_table.Primarys.Any() == false) {
if (_table.Primarys.Any() == false)
{
if (isThrow) throw new Exception($"不可更新,实体没有主键:{_fsql.GetEntityString(_entityType, data)}");
return false;
}
var key = _fsql.GetEntityKeyString(_entityType, data, false);
if (string.IsNullOrEmpty(key)) {
if (string.IsNullOrEmpty(key))
{
if (isThrow) throw new Exception($"不可更新,未设置主键的值:{_fsql.GetEntityString(_entityType, data)}");
return false;
}
if (_states.TryGetValue(key, out var tryval) == false) {
if (_states.TryGetValue(key, out var tryval) == false)
{
if (isThrow) throw new Exception($"不可更新,数据未被跟踪,应该先查询 或者 Attach{_fsql.GetEntityString(_entityType, data)}");
return false;
}
return true;
}
bool CanRemove(IEnumerable<TEntity> data, bool isThrow) {
if (data == null) {
bool CanRemove(IEnumerable<TEntity> data, bool isThrow)
{
if (data == null)
{
if (isThrow) throw new ArgumentNullException(nameof(data));
return false;
}
@ -256,17 +304,21 @@ namespace FreeSql {
foreach (var s in data) if (CanRemove(s, isThrow) == false) return false;
return true;
}
bool CanRemove(TEntity data, bool isThrow) {
if (data == null) {
bool CanRemove(TEntity data, bool isThrow)
{
if (data == null)
{
if (isThrow) throw new ArgumentNullException(nameof(data));
return false;
}
if (_table.Primarys.Any() == false) {
if (_table.Primarys.Any() == false)
{
if (isThrow) throw new Exception($"不可删除,实体没有主键:{_fsql.GetEntityString(_entityType, data)}");
return false;
}
var key = _fsql.GetEntityKeyString(_entityType, data, false);
if (string.IsNullOrEmpty(key)) {
if (string.IsNullOrEmpty(key))
{
if (isThrow) throw new Exception($"不可删除,未设置主键的值:{_fsql.GetEntityString(_entityType, data)}");
return false;
}

View File

@ -6,29 +6,37 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace FreeSql {
partial class DbSet<TEntity> {
namespace FreeSql
{
partial class DbSet<TEntity>
{
Task DbContextExecCommandAsync() {
Task DbContextExecCommandAsync()
{
_dicUpdateTimes.Clear();
return _ctx.ExecCommandAsync();
}
async Task<int> DbContextBetchAddAsync(EntityState[] adds) {
async Task<int> DbContextBetchAddAsync(EntityState[] adds)
{
if (adds.Any() == false) return 0;
var affrows = await this.OrmInsert(adds.Select(a => a.Value)).ExecuteAffrowsAsync();
return affrows;
}
#region Add
async Task AddPrivAsync(TEntity data, bool isCheck) {
async Task AddPrivAsync(TEntity data, bool isCheck)
{
if (isCheck && CanAdd(data, true) == false) return;
if (_tableIdentitys.Length > 0) {
if (_tableIdentitys.Length > 0)
{
//有自增,马上执行
switch (_fsql.Ado.DataType) {
switch (_fsql.Ado.DataType)
{
case DataType.SqlServer:
case DataType.PostgreSQL:
if (_tableIdentitys.Length == 1 && _table.Primarys.Length == 1) {
if (_tableIdentitys.Length == 1 && _table.Primarys.Length == 1)
{
await DbContextExecCommandAsync();
var idtval = await this.OrmInsert(data).ExecuteIdentityAsync();
IncrAffrows(1);
@ -36,7 +44,9 @@ namespace FreeSql {
Attach(data);
if (_ctx.Options.EnableAddOrUpdateNavigateList)
await AddOrUpdateNavigateListAsync(data);
} else {
}
else
{
await DbContextExecCommandAsync();
var newval = (await this.OrmInsert(data).ExecuteInsertedAsync()).First();
IncrAffrows(1);
@ -49,7 +59,8 @@ namespace FreeSql {
case DataType.MySql:
case DataType.Oracle:
case DataType.Sqlite:
if (_tableIdentitys.Length == 1 && _table.Primarys.Length == 1) {
if (_tableIdentitys.Length == 1 && _table.Primarys.Length == 1)
{
await DbContextExecCommandAsync();
var idtval = await this.OrmInsert(data).ExecuteIdentityAsync();
IncrAffrows(1);
@ -67,15 +78,19 @@ namespace FreeSql {
await AddOrUpdateNavigateListAsync(data);
}
public Task AddAsync(TEntity data) => AddPrivAsync(data, true);
async public Task AddRangeAsync(IEnumerable<TEntity> data) {
async public Task AddRangeAsync(IEnumerable<TEntity> data)
{
if (CanAdd(data, true) == false) return;
if (data.ElementAtOrDefault(1) == default(TEntity)) {
if (data.ElementAtOrDefault(1) == default(TEntity))
{
await AddAsync(data.First());
return;
}
if (_tableIdentitys.Length > 0) {
if (_tableIdentitys.Length > 0)
{
//有自增,马上执行
switch (_fsql.Ado.DataType) {
switch (_fsql.Ado.DataType)
{
case DataType.SqlServer:
case DataType.PostgreSQL:
await DbContextExecCommandAsync();
@ -97,7 +112,9 @@ namespace FreeSql {
await AddPrivAsync(s, false);
return;
}
} else {
}
else
{
//进入队列,等待 SaveChanges 时执行
foreach (var item in data)
EnqueueToDbContext(DbContext.ExecCommandInfoType.Insert, CreateEntityState(item));
@ -107,25 +124,30 @@ namespace FreeSql {
await AddOrUpdateNavigateListAsync(item);
}
}
async Task AddOrUpdateNavigateListAsync(TEntity item) {
async Task AddOrUpdateNavigateListAsync(TEntity item)
{
Type itemType = null;
foreach (var prop in _table.Properties) {
foreach (var prop in _table.Properties)
{
if (_table.ColumnsByCsIgnore.ContainsKey(prop.Key)) continue;
if (_table.ColumnsByCs.ContainsKey(prop.Key)) continue;
var tref = _table.GetTableRef(prop.Key, true);
if (tref == null) continue;
switch (tref.RefType) {
switch (tref.RefType)
{
case Internal.Model.TableRefType.OneToOne:
case Internal.Model.TableRefType.ManyToOne:
case Internal.Model.TableRefType.ManyToMany:
continue;
case Internal.Model.TableRefType.OneToMany:
if (itemType == null) itemType = item.GetType();
if (_table.TypeLazy != null && itemType == _table.TypeLazy) {
if (_table.TypeLazy != null && itemType == _table.TypeLazy)
{
var lazyField = _dicLazyIsSetField.GetOrAdd(_table.TypeLazy, tl => new ConcurrentDictionary<string, System.Reflection.FieldInfo>()).GetOrAdd(prop.Key, propName =>
_table.TypeLazy.GetField($"__lazy__{propName}", System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance));
if (lazyField != null) {
if (lazyField != null)
{
var lazyFieldValue = (bool)lazyField.GetValue(item);
if (lazyFieldValue == false) continue;
}
@ -135,12 +157,15 @@ namespace FreeSql {
if (propValEach == null) continue;
object dbset = null;
System.Reflection.MethodInfo dbsetAddOrUpdate = null;
foreach (var propValItem in propValEach) {
if (dbset == null) {
foreach (var propValItem in propValEach)
{
if (dbset == null)
{
dbset = _ctx.Set(tref.RefEntityType);
dbsetAddOrUpdate = dbset.GetType().GetMethod("AddOrUpdateAsync", new Type[] { tref.RefEntityType });
}
for (var colidx = 0; colidx < tref.Columns.Count; colidx++) {
for (var colidx = 0; colidx < tref.Columns.Count; colidx++)
{
tref.RefColumns[colidx].Table.Properties[tref.RefColumns[colidx].CsName]
.SetValue(propValItem, tref.Columns[colidx].Table.Properties[tref.Columns[colidx].CsName].GetValue(item));
}
@ -156,7 +181,8 @@ namespace FreeSql {
#region UpdateAsync
Task<int> DbContextBetchUpdateAsync(EntityState[] ups) => DbContextBetchUpdatePrivAsync(ups, false);
Task<int> DbContextBetchUpdateNowAsync(EntityState[] ups) => DbContextBetchUpdatePrivAsync(ups, true);
async Task<int> DbContextBetchUpdatePrivAsync(EntityState[] ups, bool isLiveUpdate) {
async Task<int> DbContextBetchUpdatePrivAsync(EntityState[] ups, bool isLiveUpdate)
{
if (ups.Any() == false) return 0;
var uplst1 = ups[ups.Length - 1];
var uplst2 = ups.Length > 1 ? ups[ups.Length - 2] : null;
@ -170,18 +196,22 @@ namespace FreeSql {
List<EntityState> data = null;
string[] cuig = null;
if (uplst2 != null && string.Compare(string.Join(",", cuig1), string.Join(",", cuig2)) != 0) {
if (uplst2 != null && string.Compare(string.Join(",", cuig1), string.Join(",", cuig2)) != 0)
{
//最后一个不保存
data = ups.ToList();
data.RemoveAt(ups.Length - 1);
cuig = cuig2;
} else if (isLiveUpdate) {
}
else if (isLiveUpdate)
{
//立即保存
data = ups.ToList();
cuig = cuig1;
}
if (data?.Count > 0) {
if (data?.Count > 0)
{
if (cuig.Length == _table.Columns.Count)
return ups.Length == data.Count ? -998 : -997;
@ -191,7 +221,8 @@ namespace FreeSql {
var affrows = await update.ExecuteAffrowsAsync();
foreach (var newval in data) {
foreach (var newval in data)
{
if (_states.TryGetValue(newval.Key, out var tryold))
_fsql.MapEntityValue(_entityType, newval.Value, tryold.Value);
if (newval.OldValue != null)
@ -203,10 +234,12 @@ namespace FreeSql {
//等待下次对比再保存
return 0;
}
async public Task UpdateAsync(TEntity data) {
async public Task UpdateAsync(TEntity data)
{
var exists = ExistsInStates(data);
if (exists == null) throw new Exception($"不可更新,未设置主键的值:{_fsql.GetEntityString(_entityType, data)}");
if (exists == false) {
if (exists == false)
{
var olddata = await OrmSelect(data).FirstAsync();
if (olddata == null) throw new Exception($"不可更新,数据库不存在该记录:{_fsql.GetEntityString(_entityType, data)}");
}
@ -214,9 +247,11 @@ namespace FreeSql {
await UpdateRangePrivAsync(new[] { data }, true);
}
public Task UpdateRangeAsync(IEnumerable<TEntity> data) => UpdateRangePrivAsync(data, true);
async Task UpdateRangePrivAsync(IEnumerable<TEntity> data, bool isCheck) {
async Task UpdateRangePrivAsync(IEnumerable<TEntity> data, bool isCheck)
{
if (CanUpdate(data, true) == false) return;
foreach (var item in data) {
foreach (var item in data)
{
if (_dicUpdateTimes.ContainsKey(item))
await DbContextExecCommandAsync();
_dicUpdateTimes.Add(item, 1);
@ -232,7 +267,8 @@ namespace FreeSql {
#endregion
#region RemoveAsync
async Task<int> DbContextBetchRemoveAsync(EntityState[] dels) {
async Task<int> DbContextBetchRemoveAsync(EntityState[] dels)
{
if (dels.Any() == false) return 0;
var affrows = await this.OrmDelete(dels.Select(a => a.Value)).ExecuteAffrowsAsync();
return Math.Max(dels.Length, affrows);
@ -240,17 +276,20 @@ namespace FreeSql {
#endregion
#region AddOrUpdateAsync
async public Task AddOrUpdateAsync(TEntity data) {
async public Task AddOrUpdateAsync(TEntity data)
{
if (data == null) throw new ArgumentNullException(nameof(data));
if (_table.Primarys.Any() == false) throw new Exception($"不可添加,实体没有主键:{_fsql.GetEntityString(_entityType, data)}");
var flagExists = ExistsInStates(data);
if (flagExists == false) {
if (flagExists == false)
{
var olddata = await OrmSelect(data).FirstAsync();
if (olddata == null) flagExists = false;
}
if (flagExists == true && CanUpdate(data, false)) {
if (flagExists == true && CanUpdate(data, false))
{
await DbContextExecCommandAsync();
var affrows = _ctx._affrows;
await UpdateRangePrivAsync(new[] { data }, false);
@ -258,7 +297,8 @@ namespace FreeSql {
affrows = _ctx._affrows - affrows;
if (affrows > 0) return;
}
if (CanAdd(data, false)) {
if (CanAdd(data, false))
{
_fsql.ClearEntityPrimaryValueWithIdentity(_entityType, data);
await AddPrivAsync(data, false);
}

View File

@ -6,29 +6,37 @@ using System.Collections.Concurrent;
using System.Linq;
using System.Reflection;
namespace FreeSql {
partial class DbSet<TEntity> {
namespace FreeSql
{
partial class DbSet<TEntity>
{
void DbContextExecCommand() {
void DbContextExecCommand()
{
_dicUpdateTimes.Clear();
_ctx.ExecCommand();
}
int DbContextBetchAdd(EntityState[] adds) {
int DbContextBetchAdd(EntityState[] adds)
{
if (adds.Any() == false) return 0;
var affrows = this.OrmInsert(adds.Select(a => a.Value)).ExecuteAffrows();
return affrows;
}
#region Add
void AddPriv(TEntity data, bool isCheck) {
void AddPriv(TEntity data, bool isCheck)
{
if (isCheck && CanAdd(data, true) == false) return;
if (_tableIdentitys.Length > 0) {
if (_tableIdentitys.Length > 0)
{
//有自增,马上执行
switch (_fsql.Ado.DataType) {
switch (_fsql.Ado.DataType)
{
case DataType.SqlServer:
case DataType.PostgreSQL:
if (_tableIdentitys.Length == 1) {
if (_tableIdentitys.Length == 1)
{
DbContextExecCommand();
var idtval = this.OrmInsert(data).ExecuteIdentity();
IncrAffrows(1);
@ -36,7 +44,9 @@ namespace FreeSql {
Attach(data);
if (_ctx.Options.EnableAddOrUpdateNavigateList)
AddOrUpdateNavigateList(data);
} else {
}
else
{
DbContextExecCommand();
var newval = this.OrmInsert(data).ExecuteInserted().First();
IncrAffrows(1);
@ -49,7 +59,8 @@ namespace FreeSql {
case DataType.MySql:
case DataType.Oracle:
case DataType.Sqlite:
if (_tableIdentitys.Length == 1) {
if (_tableIdentitys.Length == 1)
{
DbContextExecCommand();
var idtval = this.OrmInsert(data).ExecuteIdentity();
IncrAffrows(1);
@ -71,15 +82,19 @@ namespace FreeSql {
/// </summary>
/// <param name="data"></param>
public void Add(TEntity data) => AddPriv(data, true);
public void AddRange(IEnumerable<TEntity> data) {
public void AddRange(IEnumerable<TEntity> data)
{
if (CanAdd(data, true) == false) return;
if (data.ElementAtOrDefault(1) == default(TEntity)) {
if (data.ElementAtOrDefault(1) == default(TEntity))
{
Add(data.First());
return;
}
if (_tableIdentitys.Length > 0) {
if (_tableIdentitys.Length > 0)
{
//有自增,马上执行
switch (_fsql.Ado.DataType) {
switch (_fsql.Ado.DataType)
{
case DataType.SqlServer:
case DataType.PostgreSQL:
DbContextExecCommand();
@ -101,7 +116,9 @@ namespace FreeSql {
AddPriv(s, false);
return;
}
} else {
}
else
{
//进入队列,等待 SaveChanges 时执行
foreach (var item in data)
EnqueueToDbContext(DbContext.ExecCommandInfoType.Insert, CreateEntityState(item));
@ -112,24 +129,30 @@ namespace FreeSql {
}
}
static ConcurrentDictionary<Type, ConcurrentDictionary<string, FieldInfo>> _dicLazyIsSetField = new ConcurrentDictionary<Type, ConcurrentDictionary<string, FieldInfo>>();
void AddOrUpdateNavigateList(TEntity item) {
void AddOrUpdateNavigateList(TEntity item)
{
Type itemType = null;
foreach (var prop in _table.Properties) {
foreach (var prop in _table.Properties)
{
if (_table.ColumnsByCsIgnore.ContainsKey(prop.Key)) continue;
if (_table.ColumnsByCs.ContainsKey(prop.Key)) continue;
object propVal = null;
if (itemType == null) itemType = item.GetType();
if (_table.TypeLazy != null && itemType == _table.TypeLazy) {
if (_table.TypeLazy != null && itemType == _table.TypeLazy)
{
var lazyField = _dicLazyIsSetField.GetOrAdd(_table.TypeLazy, tl => new ConcurrentDictionary<string, FieldInfo>()).GetOrAdd(prop.Key, propName =>
_table.TypeLazy.GetField($"__lazy__{propName}", BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance));
if (lazyField != null) {
if (lazyField != null)
{
var lazyFieldValue = (bool)lazyField.GetValue(item);
if (lazyFieldValue == false) continue;
}
propVal = prop.Value.GetValue(item);
} else {
}
else
{
propVal = prop.Value.GetValue(item);
if (propVal == null) continue;
}
@ -137,7 +160,8 @@ namespace FreeSql {
var tref = _table.GetTableRef(prop.Key, true);
if (tref == null) continue;
switch(tref.RefType) {
switch (tref.RefType)
{
case Internal.Model.TableRefType.OneToOne:
case Internal.Model.TableRefType.ManyToOne:
case Internal.Model.TableRefType.ManyToMany:
@ -147,12 +171,15 @@ namespace FreeSql {
if (propValEach == null) continue;
object dbset = null;
MethodInfo dbsetAddOrUpdate = null;
foreach (var propValItem in propValEach) {
if (dbset == null) {
foreach (var propValItem in propValEach)
{
if (dbset == null)
{
dbset = _ctx.Set(tref.RefEntityType);
dbsetAddOrUpdate = dbset.GetType().GetMethod("AddOrUpdate", new Type[] { tref.RefEntityType });
}
for (var colidx = 0; colidx < tref.Columns.Count; colidx++) {
for (var colidx = 0; colidx < tref.Columns.Count; colidx++)
{
tref.RefColumns[colidx].Table.Properties[tref.RefColumns[colidx].CsName]
.SetValue(propValItem, tref.Columns[colidx].Table.Properties[tref.Columns[colidx].CsName].GetValue(item));
}
@ -167,7 +194,8 @@ namespace FreeSql {
#region Update
int DbContextBetchUpdate(EntityState[] ups) => DbContextBetchUpdatePriv(ups, false);
int DbContextBetchUpdateNow(EntityState[] ups) => DbContextBetchUpdatePriv(ups, true);
int DbContextBetchUpdatePriv(EntityState[] ups, bool isLiveUpdate) {
int DbContextBetchUpdatePriv(EntityState[] ups, bool isLiveUpdate)
{
if (ups.Any() == false) return 0;
var uplst1 = ups[ups.Length - 1];
var uplst2 = ups.Length > 1 ? ups[ups.Length - 2] : null;
@ -181,18 +209,22 @@ namespace FreeSql {
List<EntityState> data = null;
string[] cuig = null;
if (uplst2 != null && string.Compare(string.Join(",", cuig1), string.Join(",", cuig2)) != 0) {
if (uplst2 != null && string.Compare(string.Join(",", cuig1), string.Join(",", cuig2)) != 0)
{
//最后一个不保存
data = ups.ToList();
data.RemoveAt(ups.Length - 1);
cuig = cuig2;
} else if (isLiveUpdate) {
}
else if (isLiveUpdate)
{
//立即保存
data = ups.ToList();
cuig = cuig1;
}
if (data?.Count > 0) {
if (data?.Count > 0)
{
if (cuig.Length == _table.Columns.Count)
return ups.Length == data.Count ? -998 : -997;
@ -202,7 +234,8 @@ namespace FreeSql {
var affrows = update.ExecuteAffrows();
foreach (var newval in data) {
foreach (var newval in data)
{
if (_states.TryGetValue(newval.Key, out var tryold))
_fsql.MapEntityValue(_entityType, newval.Value, tryold.Value);
if (newval.OldValue != null)
@ -220,10 +253,12 @@ namespace FreeSql {
/// 更新
/// </summary>
/// <param name="data"></param>
public void Update(TEntity data) {
public void Update(TEntity data)
{
var exists = ExistsInStates(data);
if (exists == null) throw new Exception($"不可更新,未设置主键的值:{_fsql.GetEntityString(_entityType, data)}");
if (exists == false) {
if (exists == false)
{
var olddata = OrmSelect(data).First();
if (olddata == null) throw new Exception($"不可更新,数据库不存在该记录:{_fsql.GetEntityString(_entityType, data)}");
}
@ -231,9 +266,11 @@ namespace FreeSql {
UpdateRangePriv(new[] { data }, true);
}
public void UpdateRange(IEnumerable<TEntity> data) => UpdateRangePriv(data, true);
void UpdateRangePriv(IEnumerable<TEntity> data, bool isCheck) {
void UpdateRangePriv(IEnumerable<TEntity> data, bool isCheck)
{
if (CanUpdate(data, true) == false) return;
foreach (var item in data) {
foreach (var item in data)
{
if (_dicUpdateTimes.ContainsKey(item))
DbContextExecCommand();
_dicUpdateTimes.Add(item, 1);
@ -249,7 +286,8 @@ namespace FreeSql {
#endregion
#region Remove
int DbContextBetchRemove(EntityState[] dels) {
int DbContextBetchRemove(EntityState[] dels)
{
if (dels.Any() == false) return 0;
var affrows = this.OrmDelete(dels.Select(a => a.Value)).ExecuteAffrows();
return Math.Max(dels.Length, affrows);
@ -260,9 +298,11 @@ namespace FreeSql {
/// </summary>
/// <param name="data"></param>
public void Remove(TEntity data) => RemoveRange(new[] { data });
public void RemoveRange(IEnumerable<TEntity> data) {
public void RemoveRange(IEnumerable<TEntity> data)
{
if (CanRemove(data, true) == false) return;
foreach (var item in data) {
foreach (var item in data)
{
var state = CreateEntityState(item);
_states.TryRemove(state.Key, out var trystate);
_fsql.ClearEntityPrimaryValueWithIdentityAndGuid(_entityType, item);
@ -277,17 +317,20 @@ namespace FreeSql {
/// 添加或更新
/// </summary>
/// <param name="data"></param>
public void AddOrUpdate(TEntity data) {
public void AddOrUpdate(TEntity data)
{
if (data == null) throw new ArgumentNullException(nameof(data));
if (_table.Primarys.Any() == false) throw new Exception($"不可添加,实体没有主键:{_fsql.GetEntityString(_entityType, data)}");
var flagExists = ExistsInStates(data);
if (flagExists == false) {
if (flagExists == false)
{
var olddata = OrmSelect(data).First();
if (olddata == null) flagExists = false;
}
if (flagExists == true && CanUpdate(data, false)) {
if (flagExists == true && CanUpdate(data, false))
{
DbContextExecCommand();
var affrows = _ctx._affrows;
UpdateRangePriv(new[] { data }, false);
@ -295,7 +338,8 @@ namespace FreeSql {
affrows = _ctx._affrows - affrows;
if (affrows > 0) return;
}
if (CanAdd(data, false)) {
if (CanAdd(data, false))
{
_fsql.ClearEntityPrimaryValueWithIdentity(_entityType, data);
AddPriv(data, false);
}

View File

@ -3,15 +3,20 @@
using Microsoft.Extensions.DependencyInjection;
using System;
namespace FreeSql {
public static class DbContextDependencyInjection {
namespace FreeSql
{
public static class DbContextDependencyInjection
{
public static IServiceCollection AddFreeDbContext<TDbContext>(this IServiceCollection services, Action<DbContextOptionsBuilder> options) where TDbContext : DbContext {
public static IServiceCollection AddFreeDbContext<TDbContext>(this IServiceCollection services, Action<DbContextOptionsBuilder> options) where TDbContext : DbContext
{
services.AddScoped<TDbContext>(sp => {
services.AddScoped<TDbContext>(sp =>
{
var ctx = Activator.CreateInstance<TDbContext>();
if (ctx._orm == null) {
if (ctx._orm == null)
{
var builder = new DbContextOptionsBuilder();
options(builder);
ctx._orm = builder._fsql;

View File

@ -2,14 +2,16 @@
using System;
using System.Collections.Concurrent;
public static class FreeSqlDbContextExtenssions {
public static class FreeSqlDbContextExtenssions
{
/// <summary>
/// 创建普通数据上下文档对象
/// </summary>
/// <param name="that"></param>
/// <returns></returns>
public static DbContext CreateDbContext(this IFreeSql that) {
public static DbContext CreateDbContext(this IFreeSql that)
{
return new FreeContext(that);
}
@ -19,7 +21,8 @@ public static class FreeSqlDbContextExtenssions {
/// <typeparam name="T"></typeparam>
/// <param name="select"></param>
/// <returns></returns>
public static ISelect<T> NoTracking<T>(this ISelect<T> select) where T : class {
public static ISelect<T> NoTracking<T>(this ISelect<T> select) where T : class
{
return select.TrackToList(null);
}
@ -28,7 +31,8 @@ public static class FreeSqlDbContextExtenssions {
/// </summary>
/// <param name="that"></param>
/// <param name="options"></param>
public static void SetDbContextOptions(this IFreeSql that, Action<DbContextOptions> options) {
public static void SetDbContextOptions(this IFreeSql that, Action<DbContextOptions> options)
{
if (options == null) return;
var cfg = _dicSetDbContextOptions.GetOrAdd(that, t => new DbContextOptions());
options(cfg);

View File

@ -3,11 +3,14 @@ using System.Collections.Concurrent;
using System.Reflection;
using System.Threading.Tasks;
namespace FreeSql {
internal class RepositoryDbContext : DbContext {
namespace FreeSql
{
internal class RepositoryDbContext : DbContext
{
protected IBaseRepository _repos;
public RepositoryDbContext(IFreeSql orm, IBaseRepository repos) : base() {
public RepositoryDbContext(IFreeSql orm, IBaseRepository repos) : base()
{
_orm = orm;
_repos = repos;
_isUseUnitOfWork = false;
@ -17,14 +20,16 @@ namespace FreeSql {
static ConcurrentDictionary<Type, FieldInfo> _dicGetRepositoryDbField = new ConcurrentDictionary<Type, FieldInfo>();
static FieldInfo GetRepositoryDbField(Type type) => _dicGetRepositoryDbField.GetOrAdd(type, tp => typeof(BaseRepository<,>).MakeGenericType(tp, typeof(int)).GetField("_dbPriv", BindingFlags.Instance | BindingFlags.NonPublic));
public override IDbSet Set(Type entityType) {
public override IDbSet Set(Type entityType)
{
if (_dicSet.ContainsKey(entityType)) return _dicSet[entityType];
var tb = _orm.CodeFirst.GetTableByEntity(entityType);
if (tb == null) return null;
object repos = _repos;
if (entityType != _repos.EntityType) {
if (entityType != _repos.EntityType)
{
repos = Activator.CreateInstance(typeof(DefaultRepository<,>).MakeGenericType(entityType, typeof(int)), _repos.Orm);
(repos as IBaseRepository).UnitOfWork = _repos.UnitOfWork;
GetRepositoryDbField(entityType).SetValue(repos, this);
@ -38,21 +43,25 @@ namespace FreeSql {
return sd;
}
public static void SetRepositoryDataFilter<TEntity>(object repos, BaseRepository<TEntity> baseRepo) where TEntity : class {
public static void SetRepositoryDataFilter<TEntity>(object repos, BaseRepository<TEntity> baseRepo) where TEntity : class
{
var filter = baseRepo.DataFilter as DataFilter<TEntity>;
DataFilterUtil.SetRepositoryDataFilter(repos, fl => {
DataFilterUtil.SetRepositoryDataFilter(repos, fl =>
{
foreach (var f in filter._filters)
fl.Apply<TEntity>(f.Key, f.Value.Expression);
});
}
public override int SaveChanges() {
public override int SaveChanges()
{
ExecCommand();
var ret = _affrows;
_affrows = 0;
return ret;
}
async public override Task<int> SaveChangesAsync() {
async public override Task<int> SaveChangesAsync()
{
await ExecCommandAsync();
var ret = _affrows;
_affrows = 0;

View File

@ -3,18 +3,22 @@ using System;
using System.Collections.Generic;
using System.Linq;
namespace FreeSql {
internal class RepositoryDbSet<TEntity> : DbSet<TEntity> where TEntity : class {
namespace FreeSql
{
internal class RepositoryDbSet<TEntity> : DbSet<TEntity> where TEntity : class
{
protected BaseRepository<TEntity> _repos;
public RepositoryDbSet(BaseRepository<TEntity> repos) {
public RepositoryDbSet(BaseRepository<TEntity> repos)
{
_ctx = repos._db;
_fsql = repos.Orm;
_uow = repos.UnitOfWork;
_repos = repos;
}
protected override ISelect<TEntity> OrmSelect(object dywhere) {
protected override ISelect<TEntity> OrmSelect(object dywhere)
{
var select = base.OrmSelect(dywhere);
var filters = (_repos.DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
@ -22,10 +26,12 @@ namespace FreeSql {
return select.AsTable(_repos.AsTableSelectInternal);
}
internal ISelect<TEntity> OrmSelectInternal(object dywhere) => OrmSelect(dywhere);
protected override IUpdate<TEntity> OrmUpdate(IEnumerable<TEntity> entitys) {
protected override IUpdate<TEntity> OrmUpdate(IEnumerable<TEntity> entitys)
{
var update = base.OrmUpdate(entitys);
var filters = (_repos.DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
foreach (var filter in filters) {
foreach (var filter in filters)
{
if (entitys != null)
foreach (var entity in entitys)
if (filter.Value.ExpressionDelegate?.Invoke(entity) == false)
@ -35,7 +41,8 @@ namespace FreeSql {
return update.AsTable(_repos.AsTableInternal);
}
internal IUpdate<TEntity> OrmUpdateInternal(IEnumerable<TEntity> entitys) => OrmUpdate(entitys);
protected override IDelete<TEntity> OrmDelete(object dywhere) {
protected override IDelete<TEntity> OrmDelete(object dywhere)
{
var delete = base.OrmDelete(dywhere);
var filters = (_repos.DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
foreach (var filter in filters) delete.Where(filter.Value.Expression);
@ -43,10 +50,12 @@ namespace FreeSql {
}
internal IDelete<TEntity> OrmDeleteInternal(object dywhere) => OrmDelete(dywhere);
protected override IInsert<TEntity> OrmInsert(TEntity entity) => OrmInsert(new[] { entity });
protected override IInsert<TEntity> OrmInsert(IEnumerable<TEntity> entitys) {
protected override IInsert<TEntity> OrmInsert(IEnumerable<TEntity> entitys)
{
var insert = base.OrmInsert(entitys);
var filters = (_repos.DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
foreach (var filter in filters) {
foreach (var filter in filters)
{
if (entitys != null)
foreach (var entity in entitys)
if (filter.Value.ExpressionDelegate?.Invoke(entity) == false)

View File

@ -1,9 +1,11 @@
using System;
using System.Linq.Expressions;
namespace FreeSql {
namespace FreeSql
{
public interface IRepositoryUnitOfWork : IUnitOfWork {
public interface IRepositoryUnitOfWork : IUnitOfWork
{
/// <summary>
/// 在工作单元内创建默认仓库类,工作单元下的仓储操作具有事务特点
/// </summary>
@ -31,24 +33,29 @@ namespace FreeSql {
GuidRepository<TEntity> GetGuidRepository<TEntity>(Expression<Func<TEntity, bool>> filter = null, Func<string, string> asTable = null) where TEntity : class;
}
class RepositoryUnitOfWork : UnitOfWork, IRepositoryUnitOfWork {
class RepositoryUnitOfWork : UnitOfWork, IRepositoryUnitOfWork
{
public RepositoryUnitOfWork(IFreeSql fsql) : base(fsql) {
public RepositoryUnitOfWork(IFreeSql fsql) : base(fsql)
{
}
public GuidRepository<TEntity> GetGuidRepository<TEntity>(Expression<Func<TEntity, bool>> filter = null, Func<string, string> asTable = null) where TEntity : class {
public GuidRepository<TEntity> GetGuidRepository<TEntity>(Expression<Func<TEntity, bool>> filter = null, Func<string, string> asTable = null) where TEntity : class
{
var repos = new GuidRepository<TEntity>(_fsql, filter, asTable);
repos.UnitOfWork = this;
return repos;
}
public DefaultRepository<TEntity, TKey> GetRepository<TEntity, TKey>(Expression<Func<TEntity, bool>> filter = null) where TEntity : class {
public DefaultRepository<TEntity, TKey> GetRepository<TEntity, TKey>(Expression<Func<TEntity, bool>> filter = null) where TEntity : class
{
var repos = new DefaultRepository<TEntity, TKey>(_fsql, filter);
repos.UnitOfWork = this;
return repos;
}
public BaseRepository<TEntity> GetRepository<TEntity>(Expression<Func<TEntity, bool>> filter = null) where TEntity : class {
public BaseRepository<TEntity> GetRepository<TEntity>(Expression<Func<TEntity, bool>> filter = null) where TEntity : class
{
var repos = new DefaultRepository<TEntity, int>(_fsql, filter);
repos.UnitOfWork = this;
return repos;

View File

@ -4,8 +4,10 @@ using System.Collections.Concurrent;
using System.Linq.Expressions;
using System.Linq;
namespace FreeSql {
public interface IDataFilter<TEntity> : IDisposable where TEntity : class {
namespace FreeSql
{
public interface IDataFilter<TEntity> : IDisposable where TEntity : class
{
IDataFilter<TEntity> Apply(string filterName, Expression<Func<TEntity, bool>> filterAndValidateExp);
@ -36,9 +38,11 @@ namespace FreeSql {
bool IsEnabled(string filterName);
}
internal class DataFilter<TEntity> : IDataFilter<TEntity> where TEntity : class {
internal class DataFilter<TEntity> : IDataFilter<TEntity> where TEntity : class
{
internal class FilterItem {
internal class FilterItem
{
public Expression<Func<TEntity, bool>> Expression { get; set; }
Func<TEntity, bool> _expressionDelegate;
public Func<TEntity, bool> ExpressionDelegate => _expressionDelegate ?? (_expressionDelegate = Expression?.Compile());
@ -46,7 +50,8 @@ namespace FreeSql {
}
internal ConcurrentDictionary<string, FilterItem> _filters = new ConcurrentDictionary<string, FilterItem>(StringComparer.CurrentCultureIgnoreCase);
public IDataFilter<TEntity> Apply(string filterName, Expression<Func<TEntity, bool>> filterAndValidateExp) {
public IDataFilter<TEntity> Apply(string filterName, Expression<Func<TEntity, bool>> filterAndValidateExp)
{
if (filterName == null)
throw new ArgumentNullException(nameof(filterName));
@ -57,13 +62,17 @@ namespace FreeSql {
return this;
}
public IDisposable Disable(params string[] filterName) {
public IDisposable Disable(params string[] filterName)
{
if (filterName == null || filterName.Any() == false) return new UsingAny(() => { });
List<string> restore = new List<string>();
foreach (var name in filterName) {
if (_filters.TryGetValue(name, out var tryfi)) {
if (tryfi.IsEnabled) {
foreach (var name in filterName)
{
if (_filters.TryGetValue(name, out var tryfi))
{
if (tryfi.IsEnabled)
{
restore.Add(name);
tryfi.IsEnabled = false;
}
@ -71,33 +80,43 @@ namespace FreeSql {
}
return new UsingAny(() => this.Enable(restore.ToArray()));
}
public IDisposable DisableAll() {
public IDisposable DisableAll()
{
List<string> restore = new List<string>();
foreach (var val in _filters) {
if (val.Value.IsEnabled) {
foreach (var val in _filters)
{
if (val.Value.IsEnabled)
{
restore.Add(val.Key);
val.Value.IsEnabled = false;
}
}
return new UsingAny(() => this.Enable(restore.ToArray()));
}
class UsingAny : IDisposable {
class UsingAny : IDisposable
{
Action _ondis;
public UsingAny(Action ondis) {
public UsingAny(Action ondis)
{
_ondis = ondis;
}
public void Dispose() {
public void Dispose()
{
_ondis?.Invoke();
}
}
public IDisposable Enable(params string[] filterName) {
public IDisposable Enable(params string[] filterName)
{
if (filterName == null || filterName.Any() == false) return new UsingAny(() => { });
List<string> restore = new List<string>();
foreach (var name in filterName) {
if (_filters.TryGetValue(name, out var tryfi)) {
if (tryfi.IsEnabled == false) {
foreach (var name in filterName)
{
if (_filters.TryGetValue(name, out var tryfi))
{
if (tryfi.IsEnabled == false)
{
restore.Add(name);
tryfi.IsEnabled = true;
}
@ -105,10 +124,13 @@ namespace FreeSql {
}
return new UsingAny(() => this.Disable(restore.ToArray()));
}
public IDisposable EnableAll() {
public IDisposable EnableAll()
{
List<string> restore = new List<string>();
foreach (var val in _filters) {
if (val.Value.IsEnabled == false) {
foreach (var val in _filters)
{
if (val.Value.IsEnabled == false)
{
restore.Add(val.Key);
val.Value.IsEnabled = true;
}
@ -116,24 +138,29 @@ namespace FreeSql {
return new UsingAny(() => this.Disable(restore.ToArray()));
}
public bool IsEnabled(string filterName) {
public bool IsEnabled(string filterName)
{
if (filterName == null) return false;
return _filters.TryGetValue(filterName, out var tryfi) ? tryfi.IsEnabled : false;
}
~DataFilter() {
~DataFilter()
{
this.Dispose();
}
public void Dispose() {
public void Dispose()
{
_filters.Clear();
}
}
public class FluentDataFilter : IDisposable {
public class FluentDataFilter : IDisposable
{
internal List<(Type type, string name, LambdaExpression exp)> _filters = new List<(Type type, string name, LambdaExpression exp)>();
public FluentDataFilter Apply<TEntity>(string filterName, Expression<Func<TEntity, bool>> filterAndValidateExp) where TEntity : class {
public FluentDataFilter Apply<TEntity>(string filterName, Expression<Func<TEntity, bool>> filterAndValidateExp) where TEntity : class
{
if (filterName == null)
throw new ArgumentNullException(nameof(filterName));
if (filterAndValidateExp == null) return this;
@ -142,10 +169,12 @@ namespace FreeSql {
return this;
}
~FluentDataFilter() {
~FluentDataFilter()
{
this.Dispose();
}
public void Dispose() {
public void Dispose()
{
_filters.Clear();
}
}

View File

@ -5,23 +5,29 @@ using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace FreeSql {
namespace FreeSql
{
internal class DataFilterUtil {
internal class DataFilterUtil
{
internal static Action<FluentDataFilter> _globalDataFilter;
static ConcurrentDictionary<Type, Delegate> _dicSetRepositoryDataFilterApplyDataFilterFunc = new ConcurrentDictionary<Type, Delegate>();
static ConcurrentDictionary<Type, ConcurrentDictionary<string, bool>> _dicSetRepositoryDataFilterConvertFilterNotExists = new ConcurrentDictionary<Type, ConcurrentDictionary<string, bool>>();
internal static void SetRepositoryDataFilter(object repos, Action<FluentDataFilter> scopedDataFilter) {
if (scopedDataFilter != null) {
internal static void SetRepositoryDataFilter(object repos, Action<FluentDataFilter> scopedDataFilter)
{
if (scopedDataFilter != null)
{
SetRepositoryDataFilter(repos, null);
}
if (scopedDataFilter == null) {
if (scopedDataFilter == null)
{
scopedDataFilter = _globalDataFilter;
}
if (scopedDataFilter == null) return;
using (var globalFilter = new FluentDataFilter()) {
using (var globalFilter = new FluentDataFilter())
{
scopedDataFilter(globalFilter);
var type = repos.GetType();
@ -30,18 +36,22 @@ namespace FreeSql {
var notExists = _dicSetRepositoryDataFilterConvertFilterNotExists.GetOrAdd(type, t => new ConcurrentDictionary<string, bool>());
var newFilter = new Dictionary<string, LambdaExpression>();
foreach (var gf in globalFilter._filters) {
foreach (var gf in globalFilter._filters)
{
if (notExists.ContainsKey(gf.name)) continue;
LambdaExpression newExp = null;
var filterParameter1 = Expression.Parameter(entityType, gf.exp.Parameters[0].Name);
try {
try
{
newExp = Expression.Lambda(
typeof(Func<,>).MakeGenericType(entityType, typeof(bool)),
new ReplaceVisitor().Modify(gf.exp.Body, filterParameter1),
filterParameter1
);
} catch {
}
catch
{
notExists.TryAdd(gf.name, true); //防止第二次错误
continue;
}
@ -49,7 +59,8 @@ namespace FreeSql {
}
if (newFilter.Any() == false) return;
var del = _dicSetRepositoryDataFilterApplyDataFilterFunc.GetOrAdd(type, t => {
var del = _dicSetRepositoryDataFilterApplyDataFilterFunc.GetOrAdd(type, t =>
{
var reposParameter = Expression.Parameter(type);
var nameParameter = Expression.Parameter(typeof(string));
var expressionParameter = Expression.Parameter(
@ -64,7 +75,8 @@ namespace FreeSql {
}
).Compile();
});
foreach (var nf in newFilter) {
foreach (var nf in newFilter)
{
del.DynamicInvoke(repos, nf.Key, nf.Value);
}
newFilter.Clear();
@ -72,15 +84,18 @@ namespace FreeSql {
}
}
class ReplaceVisitor : ExpressionVisitor {
class ReplaceVisitor : ExpressionVisitor
{
private ParameterExpression parameter;
public Expression Modify(Expression expression, ParameterExpression parameter) {
public Expression Modify(Expression expression, ParameterExpression parameter)
{
this.parameter = parameter;
return Visit(expression);
}
protected override Expression VisitMember(MemberExpression node) {
protected override Expression VisitMember(MemberExpression node)
{
if (node.Expression?.NodeType == ExpressionType.Parameter)
return Expression.Property(parameter, node.Member.Name);
return base.VisitMember(node);

View File

@ -5,10 +5,13 @@ using System.Reflection;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
namespace FreeSql {
public static class FreeSqlRepositoryDependencyInjection {
namespace FreeSql
{
public static class FreeSqlRepositoryDependencyInjection
{
public static IServiceCollection AddFreeRepository(this IServiceCollection services, Action<FluentDataFilter> globalDataFilter = null, params Assembly[] assemblies) {
public static IServiceCollection AddFreeRepository(this IServiceCollection services, Action<FluentDataFilter> globalDataFilter = null, params Assembly[] assemblies)
{
DataFilterUtil._globalDataFilter = globalDataFilter;
@ -22,9 +25,12 @@ namespace FreeSql {
services.AddScoped(typeof(BaseRepository<,>), typeof(DefaultRepository<,>));
services.AddScoped(typeof(DefaultRepository<,>));
if (assemblies?.Any() == true) {
foreach(var asse in assemblies) {
foreach (var repos in asse.GetTypes().Where(a => a.IsAbstract == false && typeof(IBaseRepository).IsAssignableFrom(a))) {
if (assemblies?.Any() == true)
{
foreach (var asse in assemblies)
{
foreach (var repos in asse.GetTypes().Where(a => a.IsAbstract == false && typeof(IBaseRepository).IsAssignableFrom(a)))
{
services.AddScoped(repos);
}

View File

@ -3,7 +3,8 @@ using System;
using System.Linq.Expressions;
using System.Linq;
public static class FreeSqlRepositoryExtenssions {
public static class FreeSqlRepositoryExtenssions
{
/// <summary>
/// 返回默认仓库类
@ -13,7 +14,8 @@ public static class FreeSqlRepositoryExtenssions {
/// <param name="that"></param>
/// <param name="filter">数据过滤 + 验证</param>
/// <returns></returns>
public static DefaultRepository<TEntity, TKey> GetRepository<TEntity, TKey>(this IFreeSql that, Expression<Func<TEntity, bool>> filter = null) where TEntity : class {
public static DefaultRepository<TEntity, TKey> GetRepository<TEntity, TKey>(this IFreeSql that, Expression<Func<TEntity, bool>> filter = null) where TEntity : class
{
return new DefaultRepository<TEntity, TKey>(that, filter);
}
@ -24,7 +26,8 @@ public static class FreeSqlRepositoryExtenssions {
/// <param name="that"></param>
/// <param name="filter">数据过滤 + 验证</param>
/// <returns></returns>
public static BaseRepository<TEntity> GetRepository<TEntity>(this IFreeSql that, Expression<Func<TEntity, bool>> filter = null) where TEntity : class {
public static BaseRepository<TEntity> GetRepository<TEntity>(this IFreeSql that, Expression<Func<TEntity, bool>> filter = null) where TEntity : class
{
return new DefaultRepository<TEntity, int>(that, filter);
}
@ -36,7 +39,8 @@ public static class FreeSqlRepositoryExtenssions {
/// <param name="filter">数据过滤 + 验证</param>
/// <param name="asTable">分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository</param>
/// <returns></returns>
public static GuidRepository<TEntity> GetGuidRepository<TEntity>(this IFreeSql that, Expression<Func<TEntity, bool>> filter = null, Func<string, string> asTable = null) where TEntity : class {
public static GuidRepository<TEntity> GetGuidRepository<TEntity>(this IFreeSql that, Expression<Func<TEntity, bool>> filter = null, Func<string, string> asTable = null) where TEntity : class
{
return new GuidRepository<TEntity>(that, filter, asTable);
}
@ -48,7 +52,8 @@ public static class FreeSqlRepositoryExtenssions {
/// <param name="that"></param>
/// <param name="repos"></param>
/// <returns></returns>
public static ISelect<TEntity> FromRepository<TEntity, T2>(this ISelect<TEntity> that, BaseRepository<T2> repos) where TEntity : class where T2 : class {
public static ISelect<TEntity> FromRepository<TEntity, T2>(this ISelect<TEntity> that, BaseRepository<T2> repos) where TEntity : class where T2 : class
{
var filters = (repos.DataFilter as DataFilter<T2>)._filters.Where(a => a.Value.IsEnabled == true);
foreach (var filter in filters) that.Where<T2>(filter.Value.Expression);
return that.AsTable(repos.AsTableSelectInternal);
@ -59,7 +64,8 @@ public static class FreeSqlRepositoryExtenssions {
/// </summary>
/// <param name="that"></param>
/// <returns></returns>
public static IRepositoryUnitOfWork CreateUnitOfWork(this IFreeSql that) {
public static IRepositoryUnitOfWork CreateUnitOfWork(this IFreeSql that)
{
return new RepositoryUnitOfWork(that);
}
}

View File

@ -4,9 +4,11 @@ using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
namespace FreeSql {
namespace FreeSql
{
public abstract class BaseRepository<TEntity> : IBaseRepository<TEntity>
where TEntity : class {
where TEntity : class
{
internal RepositoryDbContext _dbPriv;
internal RepositoryDbContext _db => _dbPriv ?? (_dbPriv = new RepositoryDbContext(Orm, this));
@ -14,9 +16,11 @@ namespace FreeSql {
internal RepositoryDbSet<TEntity> _dbset => _dbsetPriv ?? (_dbsetPriv = _db.Set<TEntity>() as RepositoryDbSet<TEntity>);
public IDataFilter<TEntity> DataFilter { get; } = new DataFilter<TEntity>();
Func<string, string> _asTableVal;
protected Func<string, string> AsTable {
protected Func<string, string> AsTable
{
get => _asTableVal;
set {
set
{
_asTableVal = value;
AsTableSelect = value == null ? null : new Func<Type, string, string>((a, b) => a == EntityType ? value(b) : null);
}
@ -27,24 +31,30 @@ namespace FreeSql {
protected void ApplyDataFilter(string name, Expression<Func<TEntity, bool>> exp) => DataFilter.Apply(name, exp);
protected BaseRepository(IFreeSql fsql, Expression<Func<TEntity, bool>> filter, Func<string, string> asTable = null) {
protected BaseRepository(IFreeSql fsql, Expression<Func<TEntity, bool>> filter, Func<string, string> asTable = null)
{
Orm = fsql;
DataFilterUtil.SetRepositoryDataFilter(this, null);
DataFilter.Apply("", filter);
AsTable = asTable;
}
~BaseRepository() {
~BaseRepository()
{
this.Dispose();
}
bool _isdisposed = false;
public void Dispose() {
public void Dispose()
{
if (_isdisposed) return;
try {
try
{
_dbsetPriv?.Dispose();
_dbPriv?.Dispose();
this.DataFilter.Dispose();
} finally {
}
finally
{
_isdisposed = true;
GC.SuppressFinalize(this);
}
@ -63,57 +73,69 @@ namespace FreeSql {
public int Delete(Expression<Func<TEntity, bool>> predicate) => _dbset.OrmDeleteInternal(null).Where(predicate).ExecuteAffrows();
public Task<int> DeleteAsync(Expression<Func<TEntity, bool>> predicate) => _dbset.OrmDeleteInternal(null).Where(predicate).ExecuteAffrowsAsync();
public int Delete(TEntity entity) {
public int Delete(TEntity entity)
{
_dbset.Remove(entity);
return _db.SaveChanges();
}
public Task<int> DeleteAsync(TEntity entity) {
public Task<int> DeleteAsync(TEntity entity)
{
_dbset.Remove(entity);
return _db.SaveChangesAsync();
}
public int Delete(IEnumerable<TEntity> entitys) {
public int Delete(IEnumerable<TEntity> entitys)
{
_dbset.RemoveRange(entitys);
return _db.SaveChanges();
}
public Task<int> DeleteAsync(IEnumerable<TEntity> entitys) {
public Task<int> DeleteAsync(IEnumerable<TEntity> entitys)
{
_dbset.RemoveRange(entitys);
return _db.SaveChangesAsync();
}
public virtual TEntity Insert(TEntity entity) {
public virtual TEntity Insert(TEntity entity)
{
_dbset.Add(entity);
_db.SaveChanges();
return entity;
}
async public virtual Task<TEntity> InsertAsync(TEntity entity) {
async public virtual Task<TEntity> InsertAsync(TEntity entity)
{
await _dbset.AddAsync(entity);
_db.SaveChanges();
return entity;
}
public virtual List<TEntity> Insert(IEnumerable<TEntity> entitys) {
public virtual List<TEntity> Insert(IEnumerable<TEntity> entitys)
{
_dbset.AddRange(entitys);
_db.SaveChanges();
return entitys.ToList();
}
async public virtual Task<List<TEntity>> InsertAsync(IEnumerable<TEntity> entitys) {
async public virtual Task<List<TEntity>> InsertAsync(IEnumerable<TEntity> entitys)
{
await _dbset.AddRangeAsync(entitys);
await _db.SaveChangesAsync();
return entitys.ToList();
}
public int Update(TEntity entity) {
public int Update(TEntity entity)
{
_dbset.Update(entity);
return _db.SaveChanges();
}
public Task<int> UpdateAsync(TEntity entity) {
public Task<int> UpdateAsync(TEntity entity)
{
_dbset.Update(entity);
return _db.SaveChangesAsync();
}
public int Update(IEnumerable<TEntity> entitys) {
public int Update(IEnumerable<TEntity> entitys)
{
_dbset.UpdateRange(entitys);
return _db.SaveChanges();
}
public Task<int> UpdateAsync(IEnumerable<TEntity> entitys) {
public Task<int> UpdateAsync(IEnumerable<TEntity> entitys)
{
_dbset.UpdateRange(entitys);
return _db.SaveChangesAsync();
}
@ -122,12 +144,14 @@ namespace FreeSql {
public void Attach(IEnumerable<TEntity> data) => _db.AttachRange(data);
public void FlushState() => _dbset.FlushState();
public TEntity InsertOrUpdate(TEntity entity) {
public TEntity InsertOrUpdate(TEntity entity)
{
_dbset.AddOrUpdate(entity);
_db.SaveChanges();
return entity;
}
async public Task<TEntity> InsertOrUpdateAsync(TEntity entity) {
async public Task<TEntity> InsertOrUpdateAsync(TEntity entity)
{
await _dbset.AddOrUpdateAsync(entity);
_db.SaveChanges();
return entity;
@ -135,17 +159,21 @@ namespace FreeSql {
}
public abstract class BaseRepository<TEntity, TKey> : BaseRepository<TEntity>, IBaseRepository<TEntity, TKey>
where TEntity : class {
where TEntity : class
{
public BaseRepository(IFreeSql fsql, Expression<Func<TEntity, bool>> filter, Func<string, string> asTable = null) : base(fsql, filter, asTable) {
public BaseRepository(IFreeSql fsql, Expression<Func<TEntity, bool>> filter, Func<string, string> asTable = null) : base(fsql, filter, asTable)
{
}
public int Delete(TKey id) {
public int Delete(TKey id)
{
var stateKey = string.Concat(id);
_dbset._statesInternal.TryRemove(stateKey, out var trystate);
return _dbset.OrmDeleteInternal(id).ExecuteAffrows();
}
public Task<int> DeleteAsync(TKey id) {
public Task<int> DeleteAsync(TKey id)
{
var stateKey = string.Concat(id);
_dbset._statesInternal.TryRemove(stateKey, out var trystate);
return _dbset.OrmDeleteInternal(id).ExecuteAffrowsAsync();

View File

@ -1,16 +1,20 @@
using System;
using System.Linq.Expressions;
namespace FreeSql {
namespace FreeSql
{
public class DefaultRepository<TEntity, TKey> :
BaseRepository<TEntity, TKey>
where TEntity : class {
where TEntity : class
{
public DefaultRepository(IFreeSql fsql) : base(fsql, null, null) {
public DefaultRepository(IFreeSql fsql) : base(fsql, null, null)
{
}
public DefaultRepository(IFreeSql fsql, Expression<Func<TEntity, bool>> filter) : base(fsql, filter, null) {
public DefaultRepository(IFreeSql fsql, Expression<Func<TEntity, bool>> filter) : base(fsql, filter, null)
{
}
}
}

View File

@ -1,15 +1,19 @@
using System;
using System.Linq.Expressions;
namespace FreeSql {
namespace FreeSql
{
public class GuidRepository<TEntity> :
BaseRepository<TEntity, Guid>
where TEntity : class {
where TEntity : class
{
public GuidRepository(IFreeSql fsql) : this(fsql, null, null) {
public GuidRepository(IFreeSql fsql) : this(fsql, null, null)
{
}
public GuidRepository(IFreeSql fsql, Expression<Func<TEntity, bool>> filter, Func<string, string> asTable) : base(fsql, filter, asTable) {
public GuidRepository(IFreeSql fsql, Expression<Func<TEntity, bool>> filter, Func<string, string> asTable) : base(fsql, filter, asTable)
{
}
}
}

View File

@ -2,9 +2,11 @@
using System.Linq.Expressions;
using System.Threading.Tasks;
namespace FreeSql {
namespace FreeSql
{
public interface IBaseRepository : IDisposable {
public interface IBaseRepository : IDisposable
{
Type EntityType { get; }
IUnitOfWork UnitOfWork { get; set; }
IFreeSql Orm { get; }
@ -18,13 +20,15 @@ namespace FreeSql {
}
public interface IBaseRepository<TEntity> : IReadOnlyRepository<TEntity>, IBasicRepository<TEntity>
where TEntity : class {
where TEntity : class
{
int Delete(Expression<Func<TEntity, bool>> predicate);
Task<int> DeleteAsync(Expression<Func<TEntity, bool>> predicate);
}
public interface IBaseRepository<TEntity, TKey> : IBaseRepository<TEntity>, IReadOnlyRepository<TEntity, TKey>, IBasicRepository<TEntity, TKey>
where TEntity : class {
where TEntity : class
{
}
}

View File

@ -1,9 +1,11 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace FreeSql {
namespace FreeSql
{
public interface IBasicRepository<TEntity> : IReadOnlyRepository<TEntity>
where TEntity : class {
where TEntity : class
{
TEntity Insert(TEntity entity);
List<TEntity> Insert(IEnumerable<TEntity> entitys);
Task<TEntity> InsertAsync(TEntity entity);
@ -36,7 +38,8 @@ namespace FreeSql {
}
public interface IBasicRepository<TEntity, TKey> : IBasicRepository<TEntity>, IReadOnlyRepository<TEntity, TKey>
where TEntity : class {
where TEntity : class
{
int Delete(TKey id);
Task<int> DeleteAsync(TKey id);

View File

@ -2,9 +2,11 @@
using System.Linq.Expressions;
using System.Threading.Tasks;
namespace FreeSql {
namespace FreeSql
{
public interface IReadOnlyRepository<TEntity> : IBaseRepository
where TEntity : class {
where TEntity : class
{
IDataFilter<TEntity> DataFilter { get; }
@ -15,7 +17,8 @@ namespace FreeSql {
}
public interface IReadOnlyRepository<TEntity, TKey> : IReadOnlyRepository<TEntity>
where TEntity : class {
where TEntity : class
{
TEntity Get(TKey id);
Task<TEntity> GetAsync(TKey id);

View File

@ -1,5 +1,7 @@

namespace FreeSql.Extensions.EntityUtil {
public static class TempExtensions {
namespace FreeSql.Extensions.EntityUtil
{
public static class TempExtensions
{
}
}

View File

@ -2,8 +2,10 @@
using System.Data;
using System.Data.Common;
namespace FreeSql {
public interface IUnitOfWork : IDisposable {
namespace FreeSql
{
public interface IUnitOfWork : IDisposable
{
DbTransaction GetOrBeginTransaction(bool isCreate = true);

View File

@ -3,18 +3,22 @@ using System;
using System.Data;
using System.Data.Common;
namespace FreeSql {
class UnitOfWork : IUnitOfWork {
namespace FreeSql
{
class UnitOfWork : IUnitOfWork
{
protected IFreeSql _fsql;
protected Object<DbConnection> _conn;
protected DbTransaction _tran;
public UnitOfWork(IFreeSql fsql) {
public UnitOfWork(IFreeSql fsql)
{
_fsql = fsql;
}
void ReturnObject() {
void ReturnObject()
{
_fsql.Ado.MasterPool.Return(_conn);
_tran = null;
_conn = null;
@ -49,7 +53,8 @@ namespace FreeSql {
public IsolationLevel? IsolationLevel { get; set; }
public DbTransaction GetOrBeginTransaction(bool isCreate = true) {
public DbTransaction GetOrBeginTransaction(bool isCreate = true)
{
if (_tran != null) return _tran;
if (isCreate == false) return null;
@ -57,44 +62,62 @@ namespace FreeSql {
if (_conn != null) _fsql.Ado.MasterPool.Return(_conn);
_conn = _fsql.Ado.MasterPool.Get();
try {
try
{
_tran = IsolationLevel == null ?
_conn.Value.BeginTransaction() :
_conn.Value.BeginTransaction(IsolationLevel.Value);
} catch {
}
catch
{
ReturnObject();
throw;
}
return _tran;
}
public void Commit() {
if (_tran != null) {
try {
public void Commit()
{
if (_tran != null)
{
try
{
_tran.Commit();
} finally {
}
finally
{
ReturnObject();
}
}
}
public void Rollback() {
if (_tran != null) {
try {
public void Rollback()
{
if (_tran != null)
{
try
{
_tran.Rollback();
} finally {
}
finally
{
ReturnObject();
}
}
}
~UnitOfWork() {
~UnitOfWork()
{
this.Dispose();
}
bool _isdisposed = false;
public void Dispose() {
public void Dispose()
{
if (_isdisposed) return;
try {
try
{
this.Rollback();
} finally {
}
finally
{
_isdisposed = true;
GC.SuppressFinalize(this);
}

View File

@ -1,11 +1,14 @@
using System;
using Xunit;
namespace FreeSql.Tests {
public class RepositoryTests {
namespace FreeSql.Tests
{
public class RepositoryTests
{
[Fact]
public void AddUpdate() {
public void AddUpdate()
{
var repos = g.sqlite.GetGuidRepository<AddUpdateInfo>();
var item = repos.Insert(new AddUpdateInfo());
@ -26,7 +29,8 @@ namespace FreeSql.Tests {
}
[Fact]
public void UpdateAttach() {
public void UpdateAttach()
{
var repos = g.sqlite.GetGuidRepository<AddUpdateInfo>();
var item = new AddUpdateInfo { Id = Guid.NewGuid() };
@ -44,7 +48,8 @@ namespace FreeSql.Tests {
}
[Fact]
public void UpdateWhenNotExists() {
public void UpdateWhenNotExists()
{
var repos = g.sqlite.GetGuidRepository<AddUpdateInfo>();
var item = new AddUpdateInfo { Id = Guid.NewGuid() };
@ -53,7 +58,8 @@ namespace FreeSql.Tests {
}
[Fact]
public void Update() {
public void Update()
{
g.sqlite.Insert(new AddUpdateInfo()).ExecuteAffrows();
var repos = g.sqlite.GetGuidRepository<AddUpdateInfo>();
@ -65,7 +71,8 @@ namespace FreeSql.Tests {
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(item));
}
public class AddUpdateInfo {
public class AddUpdateInfo
{
public Guid Id { get; set; }
public string Title { get; set; }
@ -74,16 +81,20 @@ namespace FreeSql.Tests {
}
[Fact]
public void UnitOfWorkRepository() {
foreach (var fsql in new[] { g.sqlite, /*g.mysql, g.pgsql, g.oracle, g.sqlserver*/ }) {
public void UnitOfWorkRepository()
{
foreach (var fsql in new[] { g.sqlite, /*g.mysql, g.pgsql, g.oracle, g.sqlserver*/ })
{
fsql.CodeFirst.ConfigEntity<FlowModel>(f => {
fsql.CodeFirst.ConfigEntity<FlowModel>(f =>
{
f.Property(b => b.UserId).IsPrimary(true);
f.Property(b => b.Id).IsPrimary(true).IsIdentity(true);
f.Property(b => b.Name).IsNullable(false);
});
FlowModel flow = new FlowModel() {
FlowModel flow = new FlowModel()
{
CreateTime = DateTime.Now,
Name = "aaa",
LastModifyTime = DateTime.Now,
@ -93,13 +104,15 @@ namespace FreeSql.Tests {
flowRepos.Insert(flow);
//事务添加
flow = new FlowModel() {
flow = new FlowModel()
{
CreateTime = DateTime.Now,
Name = "aaa",
LastModifyTime = DateTime.Now,
UserId = 1,
};
using (var uow = fsql.CreateUnitOfWork()) {
using (var uow = fsql.CreateUnitOfWork())
{
flowRepos = uow.GetRepository<FlowModel>();
flowRepos.Insert(flow);
uow.Commit();
@ -112,7 +125,8 @@ namespace FreeSql.Tests {
{
foreach (var fsql in new[] { g.sqlite, })
{
fsql.CodeFirst.ConfigEntity<FlowModel>(f => {
fsql.CodeFirst.ConfigEntity<FlowModel>(f =>
{
f.Property(b => b.UserId).IsPrimary(true);
f.Property(b => b.Id).IsPrimary(true).IsIdentity(true);
f.Property(b => b.Name).IsNullable(false);
@ -129,7 +143,7 @@ namespace FreeSql.Tests {
};
//清理掉数据库中已存在的数据,为了接下来的插入测试
flowRepos.Delete(a => a.UserId == 1 &&a.Name== "aaa");
flowRepos.Delete(a => a.UserId == 1 && a.Name == "aaa");
using (var uow = fsql.CreateUnitOfWork())
{
@ -149,7 +163,7 @@ namespace FreeSql.Tests {
[Fact]
public void UnitOfWorkRepositoryWithDisableAfterInsert()
{
foreach (var fsql in new[] {g.sqlite,})
foreach (var fsql in new[] { g.sqlite, })
{
fsql.CodeFirst.ConfigEntity<FlowModel>(f =>
{
@ -227,7 +241,8 @@ namespace FreeSql.Tests {
}
public partial class FlowModel {
public partial class FlowModel
{
public int UserId { get; set; }
public int Id { get; set; }
public int? ParentId { get; set; }
@ -238,7 +253,8 @@ namespace FreeSql.Tests {
}
[Fact]
public void AsType() {
public void AsType()
{
g.sqlite.Insert(new AddUpdateInfo()).ExecuteAffrows();
var repos = g.sqlite.GetGuidRepository<object>();

View File

@ -6,53 +6,64 @@ using Xunit;
using System.Linq;
using Newtonsoft.Json.Linq;
namespace FreeSql.Tests {
public class UnitTest1 {
namespace FreeSql.Tests
{
public class UnitTest1
{
class testenumWhere {
class testenumWhere
{
public Guid id { get; set; }
public testenumWhereType type { get; set; }
}
public enum testenumWhereType { Menu, Class, Blaaa }
[Fact]
public void Include_ManyToMany() {
public void Include_ManyToMany()
{
g.sqlite.CodeFirst.SyncStructure<Song_tag>();
g.sqlite.CodeFirst.SyncStructure<Tag>();
g.sqlite.CodeFirst.SyncStructure<Song>();
using (var ctx = g.sqlite.CreateDbContext()) {
using (var ctx = g.sqlite.CreateDbContext())
{
var songs = ctx.Set<Song>().Select
.IncludeMany(a => a.Tags)
.ToList();
var tag1 = new Tag {
var tag1 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_manytoMany_01_中国"
};
var tag2 = new Tag {
var tag2 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_manytoMany_02_美国"
};
var tag3 = new Tag {
var tag3 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_manytoMany_03_日本"
};
ctx.AddRange(new[] { tag1, tag2, tag3 });
var song1 = new Song {
var song1 = new Song
{
Create_time = DateTime.Now,
Title = "test_manytoMany_01_我是中国人.mp3",
Url = "http://ww.baidu.com/"
};
var song2 = new Song {
var song2 = new Song
{
Create_time = DateTime.Now,
Title = "test_manytoMany_02_爱你一万年.mp3",
Url = "http://ww.163.com/"
};
var song3 = new Song {
var song3 = new Song
{
Create_time = DateTime.Now,
Title = "test_manytoMany_03_千年等一回.mp3",
Url = "http://ww.sina.com/"
@ -74,9 +85,11 @@ namespace FreeSql.Tests {
}
[Fact]
public void Add() {
public void Add()
{
g.sqlite.SetDbContextOptions(opt => {
g.sqlite.SetDbContextOptions(opt =>
{
//opt.EnableAddOrUpdateNavigateList = false;
});
@ -87,11 +100,13 @@ namespace FreeSql.Tests {
//支持 1对多 联级保存
using (var ctx = new FreeContext(g.sqlite)) {
using (var ctx = new FreeContext(g.sqlite))
{
var tags = ctx.Set<Tag>().Select.IncludeMany(a => a.Tags).ToList();
var tag = new Tag {
var tag = new Tag
{
Name = "testaddsublist",
Tags = new[] {
new Tag { Name = "sub1" },
@ -110,10 +125,12 @@ namespace FreeSql.Tests {
}
[Fact]
public void Update() {
public void Update()
{
//查询 1对多再联级保存
using (var ctx = new FreeContext(g.sqlite)) {
using (var ctx = new FreeContext(g.sqlite))
{
var tag = ctx.Set<Tag>().Select.First();
tag.Tags.Add(new Tag { Name = "sub3" });
@ -122,7 +139,8 @@ namespace FreeSql.Tests {
}
}
public class Song {
public class Song
{
[Column(IsIdentity = true)]
public int Id { get; set; }
public DateTime? Create_time { get; set; }
@ -135,7 +153,8 @@ namespace FreeSql.Tests {
[Column(IsVersion = true)]
public long versionRow { get; set; }
}
public class Song_tag {
public class Song_tag
{
public int Song_id { get; set; }
public virtual Song Song { get; set; }
@ -143,7 +162,8 @@ namespace FreeSql.Tests {
public virtual Tag Tag { get; set; }
}
public class Tag {
public class Tag
{
[Column(IsIdentity = true)]
public int Id { get; set; }
public int? Parent_id { get; set; }

View File

@ -4,16 +4,19 @@ using System.Diagnostics;
using System.Text;
public class g {
public class g
{
static Lazy<IFreeSql> sqlserverLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=10")
.UseAutoSyncStructure(true)
.UseMonitorCommand(
cmd => {
cmd =>
{
Trace.WriteLine(cmd.CommandText);
}, //监听SQL命令对象在执行前
(cmd, traceLog) => {
(cmd, traceLog) =>
{
Console.WriteLine(traceLog);
}) //监听SQL命令对象在执行后
.UseLazyLoading(true)
@ -25,10 +28,12 @@ public class g {
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
.UseAutoSyncStructure(true)
.UseMonitorCommand(
cmd => {
cmd =>
{
Trace.WriteLine(cmd.CommandText);
}, //监听SQL命令对象在执行前
(cmd, traceLog) => {
(cmd, traceLog) =>
{
Console.WriteLine(traceLog);
}) //监听SQL命令对象在执行后
.UseLazyLoading(true)
@ -42,10 +47,12 @@ public class g {
.UseSyncStructureToLower(true)
.UseLazyLoading(true)
.UseMonitorCommand(
cmd => {
cmd =>
{
Trace.WriteLine(cmd.CommandText);
}, //监听SQL命令对象在执行前
(cmd, traceLog) => {
(cmd, traceLog) =>
{
Console.WriteLine(traceLog);
}) //监听SQL命令对象在执行后
.UseNoneCommandParameter(true)
@ -60,10 +67,12 @@ public class g {
.UseNoneCommandParameter(true)
.UseMonitorCommand(
cmd => {
cmd =>
{
Trace.WriteLine(cmd.CommandText);
}, //监听SQL命令对象在执行前
(cmd, traceLog) => {
(cmd, traceLog) =>
{
Console.WriteLine(traceLog);
}) //监听SQL命令对象在执行后
.Build());
@ -74,10 +83,12 @@ public class g {
.UseAutoSyncStructure(true)
.UseLazyLoading(true)
.UseMonitorCommand(
cmd => {
cmd =>
{
Trace.WriteLine(cmd.CommandText);
}, //监听SQL命令对象在执行前
(cmd, traceLog) => {
(cmd, traceLog) =>
{
Console.WriteLine(traceLog);
}) //监听SQL命令对象在执行后
.UseNoneCommandParameter(true)

View File

@ -9,17 +9,21 @@ using System.Collections.Generic;
using System.Threading.Tasks;
using System.Threading;
namespace FreeSql.Tests.PerformanceTest {
public class MySqlAdoTest {
namespace FreeSql.Tests.PerformanceTest
{
public class MySqlAdoTest
{
[Fact]
public void Query() {
public void Query()
{
var sb = new StringBuilder();
var time = new Stopwatch();
time.Restart();
List<xxx> dplist1 = null;
using (var conn = g.mysql.Ado.MasterPool.Get()) {
using (var conn = g.mysql.Ado.MasterPool.Get())
{
dplist1 = Dapper.SqlMapper.Query<xxx>(conn.Value, "select * from song").ToList();
}
time.Stop();
@ -27,7 +31,8 @@ namespace FreeSql.Tests.PerformanceTest {
time.Restart();
List<(int, string, string)> dplist2 = null;
using (var conn = g.mysql.Ado.MasterPool.Get()) {
using (var conn = g.mysql.Ado.MasterPool.Get())
{
dplist2 = Dapper.SqlMapper.Query<(int, string, string)>(conn.Value, "select * from song").ToList();
}
time.Stop();
@ -35,7 +40,8 @@ namespace FreeSql.Tests.PerformanceTest {
time.Restart();
List<dynamic> dplist3 = null;
using (var conn = g.mysql.Ado.MasterPool.Get()) {
using (var conn = g.mysql.Ado.MasterPool.Get())
{
dplist3 = Dapper.SqlMapper.Query<dynamic>(conn.Value, "select * from song").ToList();
}
time.Stop();
@ -69,14 +75,17 @@ namespace FreeSql.Tests.PerformanceTest {
}
[Fact]
public void QueryLimit10() {
public void QueryLimit10()
{
var sb = new StringBuilder();
var time = new Stopwatch();
time.Restart();
List<xxx> dplist1 = new List<xxx>();
for (var a = 0; a < 10000; a++) {
using (var conn = g.mysql.Ado.MasterPool.Get()) {
for (var a = 0; a < 10000; a++)
{
using (var conn = g.mysql.Ado.MasterPool.Get())
{
dplist1.AddRange(Dapper.SqlMapper.Query<xxx>(conn.Value, "select * from song limit 10").ToList());
}
}
@ -85,8 +94,10 @@ namespace FreeSql.Tests.PerformanceTest {
time.Restart();
List<(int, string, string)> dplist2 = new List<(int, string, string)>();
for (var a = 0; a < 10000; a++) {
using (var conn = g.mysql.Ado.MasterPool.Get()) {
for (var a = 0; a < 10000; a++)
{
using (var conn = g.mysql.Ado.MasterPool.Get())
{
dplist2.AddRange(Dapper.SqlMapper.Query<(int, string, string)>(conn.Value, "select * from song limit 10").ToList());
}
}
@ -95,8 +106,10 @@ namespace FreeSql.Tests.PerformanceTest {
time.Restart();
List<dynamic> dplist3 = new List<dynamic>();
for (var a = 0; a < 10000; a++) {
using (var conn = g.mysql.Ado.MasterPool.Get()) {
for (var a = 0; a < 10000; a++)
{
using (var conn = g.mysql.Ado.MasterPool.Get())
{
dplist3.AddRange(Dapper.SqlMapper.Query<dynamic>(conn.Value, "select * from song limit 10").ToList());
}
}
@ -108,7 +121,8 @@ namespace FreeSql.Tests.PerformanceTest {
time.Restart();
List<xxx> t3 = new List<xxx>();
for (var a = 0; a < 10000; a++) {
for (var a = 0; a < 10000; a++)
{
t3.AddRange(g.mysql.Ado.Query<xxx>("select * from song limit 10"));
}
time.Stop();
@ -116,7 +130,8 @@ namespace FreeSql.Tests.PerformanceTest {
time.Restart();
List<(int, string, string)> t4 = new List<(int, string, string)>();
for (var a = 0; a < 10000; a++) {
for (var a = 0; a < 10000; a++)
{
t4.AddRange(g.mysql.Ado.Query<(int, string, string)>("select * from song limit 10"));
}
time.Stop();
@ -124,7 +139,8 @@ namespace FreeSql.Tests.PerformanceTest {
time.Restart();
List<dynamic> t5 = new List<dynamic>();
for (var a = 0; a < 10000; a++) {
for (var a = 0; a < 10000; a++)
{
t5.AddRange(g.mysql.Ado.Query<dynamic>("select * from song limit 10"));
}
time.Stop();
@ -133,7 +149,8 @@ namespace FreeSql.Tests.PerformanceTest {
}
[Fact]
public void ToList() {
public void ToList()
{
var sb = new StringBuilder();
var time = new Stopwatch();
@ -146,7 +163,8 @@ namespace FreeSql.Tests.PerformanceTest {
time.Restart();
List<xxx> dplist1 = null;
using (var conn = g.mysql.Ado.MasterPool.Get()) {
using (var conn = g.mysql.Ado.MasterPool.Get())
{
dplist1 = Dapper.SqlMapper.Query<xxx>(conn.Value, "select * from song").ToList();
}
time.Stop();
@ -154,15 +172,18 @@ namespace FreeSql.Tests.PerformanceTest {
}
[Fact]
public void ToListLimit10() {
public void ToListLimit10()
{
var sb = new StringBuilder();
var time = new Stopwatch();
time.Restart();
var t3Count = 0;
var p3 = Parallel.For(1, 50, b => {
var p3 = Parallel.For(1, 50, b =>
{
List<xxx> t3 = new List<xxx>();
for (var a = 0; a < 1000; a++) {
for (var a = 0; a < 1000; a++)
{
t3.AddRange(g.mysql.Select<xxx>().Limit(50).ToList());
}
Interlocked.Add(ref t3Count, t3.Count);
@ -173,10 +194,13 @@ namespace FreeSql.Tests.PerformanceTest {
time.Restart();
var dplist1Count = 0;
var p1 = Parallel.For(1, 50, b => {
var p1 = Parallel.For(1, 50, b =>
{
List<xxx> dplist1 = new List<xxx>();
for (var a = 0; a < 1000; a++) {
using (var conn = g.mysql.Ado.MasterPool.Get()) {
for (var a = 0; a < 1000; a++)
{
using (var conn = g.mysql.Ado.MasterPool.Get())
{
dplist1.AddRange(Dapper.SqlMapper.Query<xxx>(conn.Value, "select * from song limit 50").ToList());
}
}
@ -188,7 +212,8 @@ namespace FreeSql.Tests.PerformanceTest {
}
[Table(Name = "song")]
class xxx {
class xxx
{
public int Id { get; set; }
public string Title { get; set; }
//public string Url { get; set; }

View File

@ -3,7 +3,8 @@ using System.Collections.Generic;
using System.Text;
public class g {
public class g
{
public static IFreeSql mysql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=100")

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlConnector {
public class MySqlDeleteTest {
namespace FreeSql.Tests.MySqlConnector
{
public class MySqlDeleteTest
{
IDelete<Topic> delete => g.mysql.Delete<Topic>(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -19,7 +22,8 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void Dywhere() {
public void Dywhere()
{
Assert.Null(g.mysql.Delete<Topic>().ToSql());
var sql = g.mysql.Delete<Topic>(new[] { 1, 2 }).ToSql();
Assert.Equal("DELETE FROM `tb_topic` WHERE (`Id` = 1 OR `Id` = 2)", sql);
@ -35,7 +39,8 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void Where() {
public void Where()
{
var sql = delete.Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("DELETE FROM `tb_topic` WHERE (`Id` = 1)", sql);
@ -53,23 +58,27 @@ namespace FreeSql.Tests.MySqlConnector {
Assert.Equal("DELETE FROM `tb_topic` WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))", sql);
}
[Fact]
public void WhereExists() {
public void WhereExists()
{
}
[Fact]
public void ExecuteAffrows() {
public void ExecuteAffrows()
{
var id = g.mysql.Insert<Topic>(new Topic { Title = "xxxx" }).ExecuteIdentity();
Assert.Equal(1, delete.Where(a => a.Id == id).ExecuteAffrows());
}
[Fact]
public void ExecuteDeleted() {
public void ExecuteDeleted()
{
//delete.Where(a => a.Id > 0).ExecuteDeleted();
}
[Fact]
public void AsTable() {
public void AsTable()
{
Assert.Null(g.mysql.Delete<Topic>().ToSql());
var sql = g.mysql.Delete<Topic>(new[] { 1, 2 }).AsTable(a => "TopicAsTable").ToSql();
Assert.Equal("DELETE FROM `TopicAsTable` WHERE (`Id` = 1 OR `Id` = 2)", sql);

View File

@ -4,20 +4,24 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlConnector {
public class MySqlInsertTest {
namespace FreeSql.Tests.MySqlConnector
{
public class MySqlInsertTest
{
IInsert<Topic> insert => g.mysql.Insert<Topic>(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
class TestEnumInsertTb {
class TestEnumInsertTb
{
[Column(IsIdentity = true)]
public int id { get; set; }
public TestEnumInserTbType type { get; set; }
@ -26,7 +30,8 @@ namespace FreeSql.Tests.MySqlConnector {
enum TestEnumInserTbType { str1, biggit, sum211 }
[Fact]
public void AppendData() {
public void AppendData()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
@ -50,18 +55,20 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void InsertColumns() {
public void InsertColumns()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
var sql = insert.AppendData(items).InsertColumns(a => a.Title).ToSql();
Assert.Equal("INSERT INTO `tb_topic`(`Title`) VALUES(@Title_0), (@Title_1), (@Title_2), (@Title_3), (@Title_4), (@Title_5), (@Title_6), (@Title_7), (@Title_8), (@Title_9)", sql);
sql = insert.AppendData(items).InsertColumns(a =>new { a.Title, a.Clicks }).ToSql();
sql = insert.AppendData(items).InsertColumns(a => new { a.Title, a.Clicks }).ToSql();
Assert.Equal("INSERT INTO `tb_topic`(`Clicks`, `Title`) VALUES(@Clicks_0, @Title_0), (@Clicks_1, @Title_1), (@Clicks_2, @Title_2), (@Clicks_3, @Title_3), (@Clicks_4, @Title_4), (@Clicks_5, @Title_5), (@Clicks_6, @Title_6), (@Clicks_7, @Title_7), (@Clicks_8, @Title_8), (@Clicks_9, @Title_9)", sql);
}
[Fact]
public void IgnoreColumns() {
public void IgnoreColumns()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
@ -72,7 +79,8 @@ namespace FreeSql.Tests.MySqlConnector {
Assert.Equal("INSERT INTO `tb_topic`(`Clicks`) VALUES(@Clicks_0), (@Clicks_1), (@Clicks_2), (@Clicks_3), (@Clicks_4), (@Clicks_5), (@Clicks_6), (@Clicks_7), (@Clicks_8), (@Clicks_9)", sql);
}
[Fact]
public void ExecuteAffrows() {
public void ExecuteAffrows()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
@ -83,19 +91,21 @@ namespace FreeSql.Tests.MySqlConnector {
Assert.Equal(1, g.mysql.Insert<TestEnumInsertTb>().AppendData(new TestEnumInsertTb { type = TestEnumInserTbType.sum211 }).NoneParameter().ExecuteAffrows());
}
[Fact]
public void ExecuteIdentity() {
public void ExecuteIdentity()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
Assert.NotEqual(0, insert.AppendData(items.First()).ExecuteIdentity());
var id = g.mysql.Insert<TestEnumInsertTb>().AppendData(new TestEnumInsertTb { type = TestEnumInserTbType.sum211 }).ExecuteIdentity();
Assert.Equal(TestEnumInserTbType.sum211, g.mysql.Select< TestEnumInsertTb>().Where(a => a.id == id).First()?.type);
Assert.Equal(TestEnumInserTbType.sum211, g.mysql.Select<TestEnumInsertTb>().Where(a => a.id == id).First()?.type);
id = g.mysql.Insert<TestEnumInsertTb>().AppendData(new TestEnumInsertTb { type = TestEnumInserTbType.sum211 }).NoneParameter().ExecuteIdentity();
Assert.Equal(TestEnumInserTbType.sum211, g.mysql.Select<TestEnumInsertTb>().Where(a => a.id == id).First()?.type);
}
[Fact]
public void ExecuteInserted() {
public void ExecuteInserted()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
@ -103,7 +113,8 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void AsTable() {
public void AsTable()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newTitle{a}", Clicks = a * 100 });

View File

@ -5,14 +5,17 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlConnector {
namespace FreeSql.Tests.MySqlConnector
{
public class MySqlSelectTest {
public class MySqlSelectTest
{
ISelect<Topic> select => g.mysql.Select<Topic>();
[Table(Name = "tb_topic")]
public class Topic {
public class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -24,12 +27,14 @@ namespace FreeSql.Tests.MySqlConnector {
public virtual TopicFields Fields { get; set; }
}
public class TopicFields {
public class TopicFields
{
[Column(IsPrimary = true)]
public int TopicId { get; set; }
public virtual Topic Topic { get; set; }
}
public class TestTypeInfo {
public class TestTypeInfo
{
[Column(IsIdentity = true)]
public int Guid { get; set; }
@ -40,7 +45,8 @@ namespace FreeSql.Tests.MySqlConnector {
public virtual ICollection<Topic> Topics { get; set; }
}
public class TestTypeParentInfo {
public class TestTypeParentInfo
{
[Column(IsIdentity = true)]
public int Id { get; set; }
public string Name { get; set; }
@ -48,7 +54,8 @@ namespace FreeSql.Tests.MySqlConnector {
public List<TestTypeInfo> Types { get; set; }
}
public partial class Song {
public partial class Song
{
[Column(IsIdentity = true)]
public int Id { get; set; }
public DateTime? Create_time { get; set; }
@ -58,14 +65,16 @@ namespace FreeSql.Tests.MySqlConnector {
public virtual ICollection<Tag> Tags { get; set; }
}
public partial class Song_tag {
public partial class Song_tag
{
public int Song_id { get; set; }
public virtual Song Song { get; set; }
public int Tag_id { get; set; }
public virtual Tag Tag { get; set; }
}
public partial class Tag {
public partial class Tag
{
[Column(IsIdentity = true)]
public int Id { get; set; }
public int? Parent_id { get; set; }
@ -79,7 +88,8 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Table(Name = "TestInfoT1", SelectFilter = " a.id > 0")]
class TestInfo {
class TestInfo
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int TypeGuid { get; set; }
@ -89,7 +99,8 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void AsSelect() {
public void AsSelect()
{
//OneToOne、ManyToOne
var t0 = g.mysql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
//SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
@ -122,7 +133,8 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void Lazy() {
public void Lazy()
{
var tags = g.mysql.Select<Tag>().Where(a => a.Parent.Name == "xxx")
.LeftJoin(a => a.Parent_id == a.Parent.Id)
.ToSql();
@ -131,7 +143,8 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void ToDataTable() {
public void ToDataTable()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
@ -146,13 +159,15 @@ namespace FreeSql.Tests.MySqlConnector {
var dt3 = select.Limit(10).ToDataTable(a => new { a.Id, a.Type.Name, now = DateTime.Now });
}
class TestDto {
class TestDto
{
public int id { get; set; }
public string name { get; set; } //这是join表的属性
public int ParentId { get; set; } //这是join表的属性
}
[Fact]
public void ToList() {
public void ToList()
{
var testDto1 = select.Limit(10).ToList(a => new TestDto { id = a.Id, name = a.Title });
var testDto2 = select.Limit(10).ToList(a => new TestDto());
@ -200,19 +215,23 @@ namespace FreeSql.Tests.MySqlConnector {
.LeftJoin(a => c.Id == b.ParentId)
.Where(a => b.Name != "xxx"));
var list111sql = list111.ToSql();
var list111data = list111.ToList((a, b, c) => new {
var list111data = list111.ToList((a, b, c) => new
{
a.Id,
title_substring = a.Title.Substring(0, 1),
a.Type,
ccc = new { a.Id, a.Title },
tp = a.Type,
tp2 = new {
tp2 = new
{
a.Id,
tp2 = a.Type.Name
},
tp3 = new {
tp3 = new
{
a.Id,
tp33 = new {
tp33 = new
{
a.Id
}
}
@ -220,19 +239,23 @@ namespace FreeSql.Tests.MySqlConnector {
var ttt122 = g.mysql.Select<TestTypeParentInfo>().Where(a => a.Id > 0).ToSql();
var sql5 = g.mysql.Select<TestInfo>().From<TestTypeInfo, TestTypeParentInfo>((s, b, c) => s).Where((a, b, c) => a.Id == b.ParentId).ToSql();
var t11112 = g.mysql.Select<TestInfo>().ToList(a => new {
var t11112 = g.mysql.Select<TestInfo>().ToList(a => new
{
a.Id,
a.Title,
a.Type,
ccc = new { a.Id, a.Title },
tp = a.Type,
tp2 = new {
tp2 = new
{
a.Id,
tp2 = a.Type.Name
},
tp3 = new {
tp3 = new
{
a.Id,
tp33 = new {
tp33 = new
{
a.Id
}
}
@ -254,17 +277,20 @@ namespace FreeSql.Tests.MySqlConnector {
var t11 = select.Where(a => a.Type.Name.Length > 0).ToList(true);
var t21 = select.Where(a => a.Type.Parent.Name.Length > 0).ToList(true);
}
class TestGuidIdToList {
class TestGuidIdToList
{
public Guid id { get; set; }
public string title { get; set; } = Guid.NewGuid().ToString();
}
[Fact]
public void ToOne() {
public void ToOne()
{
var testnotfind = select.Where("1=2").First(a => a.CreateTime);
Assert.Equal(default(DateTime), testnotfind);
}
[Fact]
public void ToSql() {
public void ToSql()
{
g.mysql.Insert<testenumWhere>().AppendData(new testenumWhere { type = testenumWhereType.Blaaa }).ExecuteAffrows();
var sql1 = g.mysql.Select<testenumWhere>().Where(a => a.type == testenumWhereType.Blaaa).ToSql();
@ -273,14 +299,16 @@ namespace FreeSql.Tests.MySqlConnector {
var sql3 = g.mysql.Select<testenumWhere>().Where(a => a.type.Equals(testenumWhereType.Blaaa)).ToSql();
var tolist = g.mysql.Select<testenumWhere>().Where(a => a.type == testenumWhereType.Blaaa).ToList();
}
class testenumWhere {
class testenumWhere
{
public Guid id { get; set; }
public testenumWhereType type { get; set; }
}
public enum testenumWhereType { Menu, Class, Blaaa }
[Fact]
public void Any() {
public void Any()
{
var count = select.Where(a => 1 == 1).Count();
Assert.False(select.Where(a => 1 == 2).Any());
Assert.Equal(count > 0, select.Where(a => 1 == 1).Any());
@ -302,18 +330,21 @@ namespace FreeSql.Tests.MySqlConnector {
collectionSelect.ToList();
}
[Fact]
public void Count() {
public void Count()
{
var count = select.Where(a => 1 == 1).Count();
select.Where(a => 1 == 1).Count(out var count2);
Assert.Equal(count, count2);
Assert.Equal(0, select.Where(a => 1 == 2).Count());
}
[Fact]
public void Master() {
public void Master()
{
Assert.StartsWith(" SELECT", select.Master().Where(a => 1 == 1).ToSql());
}
[Fact]
public void From() {
public void From()
{
var query2 = select.From<TestTypeInfo>((s, b) => s
.LeftJoin(a => a.TypeGuid == b.Guid)
);
@ -330,7 +361,8 @@ namespace FreeSql.Tests.MySqlConnector {
query3.ToList();
}
[Fact]
public void LeftJoin() {
public void LeftJoin()
{
//<2F><><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a.Type<70><65>a.Type.Parent <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
var query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid);
var sql = query.ToSql().Replace("\r\n", "");
@ -398,7 +430,8 @@ namespace FreeSql.Tests.MySqlConnector {
query.ToList();
}
[Fact]
public void InnerJoin() {
public void InnerJoin()
{
//<2F><><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a.Type<70><65>a.Type.Parent <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
var query = select.InnerJoin(a => a.Type.Guid == a.TypeGuid);
var sql = query.ToSql().Replace("\r\n", "");
@ -467,7 +500,8 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void RightJoin() {
public void RightJoin()
{
//<2F><><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a.Type<70><65>a.Type.Parent <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
var query = select.RightJoin(a => a.Type.Guid == a.TypeGuid);
var sql = query.ToSql().Replace("\r\n", "");
@ -536,7 +570,8 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void Where() {
public void Where()
{
var sqltmp1 = select.Where(a => a.Id == 0 && (a.Title == "x" || a.Title == "y") && a.Clicks == 1).ToSql();
var sqltmp2 = select.Where(a => a.Id.Equals(true) && (a.Title.Equals("x") || a.Title.Equals("y")) && a.Clicks.Equals(1)).ToSql();
@ -606,7 +641,8 @@ namespace FreeSql.Tests.MySqlConnector {
query.ToList();
}
[Fact]
public void WhereIf() {
public void WhereIf()
{
//<2F><><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a.Type<70><65>a.Type.Parent <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
var query = select.WhereIf(true, a => a.Id == 10);
var sql = query.ToSql().Replace("\r\n", "");
@ -700,7 +736,8 @@ namespace FreeSql.Tests.MySqlConnector {
query.ToList();
}
[Fact]
public void WhereExists() {
public void WhereExists()
{
var sql2222 = select.Where(a => select.Where(b => b.Id == a.Id).Any()).ToList();
sql2222 = select.Where(a =>
@ -713,7 +750,8 @@ namespace FreeSql.Tests.MySqlConnector {
).ToList();
}
[Fact]
public void GroupBy() {
public void GroupBy()
{
var groupby = select.From<TestTypeInfo, TestTypeParentInfo>((s, b, c) => s
.Where(a => a.Id == 1)
)
@ -724,7 +762,8 @@ namespace FreeSql.Tests.MySqlConnector {
.OrderByDescending(a => a.Count())
.Offset(10)
.Limit(2)
.ToList(a => new {
.ToList(a => new
{
a.Key.tt2,
cou1 = a.Count(),
arg1 = a.Avg(a.Key.mod4),
@ -738,7 +777,8 @@ namespace FreeSql.Tests.MySqlConnector {
var aggsql1 = select
.GroupBy(a => a.Title)
.ToSql(b => new {
.ToSql(b => new
{
b.Key,
cou = b.Count(),
sum = b.Sum(b.Key),
@ -746,7 +786,8 @@ namespace FreeSql.Tests.MySqlConnector {
});
var aggtolist1 = select
.GroupBy(a => a.Title)
.ToList(b => new {
.ToList(b => new
{
b.Key,
cou = b.Count(),
sum = b.Sum(b.Key),
@ -755,7 +796,8 @@ namespace FreeSql.Tests.MySqlConnector {
var aggsql2 = select
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
.ToSql(b => new {
.ToSql(b => new
{
b.Key.Title,
b.Key.yyyy,
@ -765,7 +807,8 @@ namespace FreeSql.Tests.MySqlConnector {
});
var aggtolist2 = select
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
.ToList(b => new {
.ToList(b => new
{
b.Key.Title,
b.Key.yyyy,
@ -776,7 +819,8 @@ namespace FreeSql.Tests.MySqlConnector {
var aggsql3 = select
.GroupBy(a => a.Title)
.ToSql(b => new {
.ToSql(b => new
{
b.Key,
cou = b.Count(),
sum = b.Sum(b.Key),
@ -785,24 +829,29 @@ namespace FreeSql.Tests.MySqlConnector {
});
}
[Fact]
public void ToAggregate() {
public void ToAggregate()
{
var sql = select.ToAggregate(a => new { sum = a.Sum(a.Key.Id + 11.11), avg = a.Avg(a.Key.Id), count = a.Count(), max = a.Max(a.Key.Id), min = a.Min(a.Key.Id) });
}
[Fact]
public void OrderBy() {
public void OrderBy()
{
var sql = select.OrderBy(a => new Random().NextDouble()).ToList();
}
[Fact]
public void Skip_Offset() {
public void Skip_Offset()
{
var sql = select.Offset(10).Limit(10).ToList();
}
[Fact]
public void Take_Limit() {
public void Take_Limit()
{
var sql = select.Limit(10).ToList();
}
[Fact]
public void Page() {
public void Page()
{
var sql1 = select.Page(1, 10).ToList();
var sql2 = select.Page(2, 10).ToList();
var sql3 = select.Page(3, 10).ToList();
@ -812,33 +861,41 @@ namespace FreeSql.Tests.MySqlConnector {
var sql33 = select.OrderBy(a => new Random().NextDouble()).Page(3, 10).ToList();
}
[Fact]
public void Distinct() {
public void Distinct()
{
var t1 = select.Distinct().ToList(a => a.Title);
var t2 = select.Distinct().Limit(10).ToList(a => a.Title);
}
[Fact]
public void Sum() {
public void Sum()
{
}
[Fact]
public void Min() {
public void Min()
{
}
[Fact]
public void Max() {
public void Max()
{
}
[Fact]
public void Avg() {
public void Avg()
{
}
[Fact]
public void As() {
public void As()
{
}
[Fact]
public void AsTable() {
public void AsTable()
{
var listt = select.AsTable((a, b) => "(select * from tb_topic where clicks > 10)").Page(1, 10).ToList();
Func<Type, string, string> tableRule = (type, oldname) => {
Func<Type, string, string> tableRule = (type, oldname) =>
{
if (type == typeof(Topic)) return oldname + "AsTable1";
else if (type == typeof(TestTypeInfo)) return oldname + "AsTable2";
return oldname + "AsTable";
@ -900,14 +957,16 @@ namespace FreeSql.Tests.MySqlConnector {
Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topicAsTable1` a LEFT JOIN TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = @bname", sql);
}
public class TestInclude_OneToManyModel1 {
public class TestInclude_OneToManyModel1
{
[Column(IsIdentity = true)]
public int id { get; set; }
public virtual TestInclude_OneToManyModel2 model2 { get; set; }
public string m1name { get; set; }
}
public class TestInclude_OneToManyModel2 {
public class TestInclude_OneToManyModel2
{
[Column(IsPrimary = true)]
public int model2id { get; set; }
public virtual TestInclude_OneToManyModel1 model1 { get; set; }
@ -916,7 +975,8 @@ namespace FreeSql.Tests.MySqlConnector {
public List<TestInclude_OneToManyModel3> childs { get; set; }
}
public class TestInclude_OneToManyModel3 {
public class TestInclude_OneToManyModel3
{
[Column(IsIdentity = true)]
public int id { get; set; }
@ -925,7 +985,8 @@ namespace FreeSql.Tests.MySqlConnector {
public List<TestInclude_OneToManyModel4> childs2 { get; set; }
}
public class TestInclude_OneToManyModel4 {
public class TestInclude_OneToManyModel4
{
[Column(IsIdentity = true)]
public int id { get; set; }
@ -934,7 +995,8 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void Include_OneToMany() {
public void Include_OneToMany()
{
var model1 = new TestInclude_OneToManyModel1 { m1name = DateTime.Now.Second.ToString() };
model1.id = (int)g.mysql.Insert(model1).ExecuteIdentity();
var model2 = new TestInclude_OneToManyModel2 { model2id = model1.id, m2setting = DateTime.Now.Second.ToString() };
@ -989,7 +1051,8 @@ namespace FreeSql.Tests.MySqlConnector {
.ToList();
}
public class TestInclude_OneToManyModel11 {
public class TestInclude_OneToManyModel11
{
[Column(IsIdentity = true)]
public int id { get; set; }
public int model2id { get; set; }
@ -998,13 +1061,15 @@ namespace FreeSql.Tests.MySqlConnector {
public string m1name { get; set; }
}
public class TestInclude_OneToManyModel22 {
public class TestInclude_OneToManyModel22
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string m2setting { get; set; }
public List<TestInclude_OneToManyModel33> childs { get; set; }
}
public class TestInclude_OneToManyModel33 {
public class TestInclude_OneToManyModel33
{
[Column(IsIdentity = true)]
public int id { get; set; }
public int model2Id { get; set; }
@ -1012,7 +1077,8 @@ namespace FreeSql.Tests.MySqlConnector {
public string setting { get; set; }
}
[Fact]
public void Include_OneToMany2() {
public void Include_OneToMany2()
{
string setting = "x";
var model2 = new TestInclude_OneToManyModel22 { m2setting = DateTime.Now.Second.ToString() };
model2.id = (int)g.mysql.Insert(model2).ExecuteIdentity();
@ -1042,37 +1108,44 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void Include_OneToChilds() {
var tag1 = new Tag {
public void Include_OneToChilds()
{
var tag1 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_01_中国"
};
tag1.Id = (int)g.mysql.Insert(tag1).ExecuteIdentity();
var tag1_1 = new Tag {
var tag1_1 = new Tag
{
Parent_id = tag1.Id,
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_01_北京"
};
tag1_1.Id = (int)g.mysql.Insert(tag1_1).ExecuteIdentity();
var tag1_2 = new Tag {
var tag1_2 = new Tag
{
Parent_id = tag1.Id,
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_01_上海"
};
tag1_2.Id = (int)g.mysql.Insert(tag1_2).ExecuteIdentity();
var tag2 = new Tag {
var tag2 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_02_美国"
};
tag2.Id = (int)g.mysql.Insert(tag2).ExecuteIdentity();
var tag2_1 = new Tag {
var tag2_1 = new Tag
{
Parent_id = tag2.Id,
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_02_纽约"
};
tag2_1.Id = (int)g.mysql.Insert(tag2_1).ExecuteIdentity();
var tag2_2 = new Tag {
var tag2_2 = new Tag
{
Parent_id = tag2.Id,
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_02_华盛顿"
@ -1132,37 +1205,44 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void Include_ManyToMany() {
public void Include_ManyToMany()
{
var tag1 = new Tag {
var tag1 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_manytoMany_01_中国"
};
tag1.Id = (int)g.mysql.Insert(tag1).ExecuteIdentity();
var tag2 = new Tag {
var tag2 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_manytoMany_02_美国"
};
tag2.Id = (int)g.mysql.Insert(tag2).ExecuteIdentity();
var tag3 = new Tag {
var tag3 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_manytoMany_03_日本"
};
tag3.Id = (int)g.mysql.Insert(tag3).ExecuteIdentity();
var song1 = new Song {
var song1 = new Song
{
Create_time = DateTime.Now,
Title = "test_manytoMany_01_我是中国人.mp3",
Url = "http://ww.baidu.com/"
};
song1.Id = (int)g.mysql.Insert(song1).ExecuteIdentity();
var song2 = new Song {
var song2 = new Song
{
Create_time = DateTime.Now,
Title = "test_manytoMany_02_爱你一万年.mp3",
Url = "http://ww.163.com/"
};
song2.Id = (int)g.mysql.Insert(song2).ExecuteIdentity();
var song3 = new Song {
var song3 = new Song
{
Create_time = DateTime.Now,
Title = "test_manytoMany_03_千年等一回.mp3",
Url = "http://ww.sina.com/"

View File

@ -3,19 +3,23 @@ using System;
using System.Collections.Generic;
using Xunit;
namespace FreeSql.Tests.MySqlConnector {
public class MySqlUpdateTest {
namespace FreeSql.Tests.MySqlConnector
{
public class MySqlUpdateTest
{
IUpdate<Topic> update => g.mysql.Update<Topic>();
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int? Clicks { get; set; }
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
class TestEnumUpdateTb {
class TestEnumUpdateTb
{
[Column(IsIdentity = true)]
public int id { get; set; }
public TestEnumUpdateTbType type { get; set; }
@ -24,7 +28,8 @@ namespace FreeSql.Tests.MySqlConnector {
enum TestEnumUpdateTbType { str1, biggit, sum211 }
[Fact]
public void Dywhere() {
public void Dywhere()
{
Assert.Null(g.mysql.Update<Topic>().ToSql());
Assert.Equal("UPDATE `tb_topic` SET title='test' \r\nWHERE (`Id` = 1 OR `Id` = 2)", g.mysql.Update<Topic>(new[] { 1, 2 }).SetRaw("title='test'").ToSql());
Assert.Equal("UPDATE `tb_topic` SET title='test1' \r\nWHERE (`Id` = 1)", g.mysql.Update<Topic>(new Topic { Id = 1, Title = "test" }).SetRaw("title='test1'").ToSql());
@ -33,7 +38,8 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void SetSource() {
public void SetSource()
{
var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET `Clicks` = @p_0, `Title` = @p_1, `CreateTime` = @p_2 WHERE (`Id` = 1)", sql);
@ -46,7 +52,7 @@ namespace FreeSql.Tests.MySqlConnector {
sql = update.SetSource(items).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET `Title` = CASE `Id` WHEN 1 THEN @p_0 WHEN 2 THEN @p_1 WHEN 3 THEN @p_2 WHEN 4 THEN @p_3 WHEN 5 THEN @p_4 WHEN 6 THEN @p_5 WHEN 7 THEN @p_6 WHEN 8 THEN @p_7 WHEN 9 THEN @p_8 WHEN 10 THEN @p_9 END WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))", sql);
sql = update.SetSource(items).Set(a => a.CreateTime, new DateTime(2020,1,1)).ToSql().Replace("\r\n", "");
sql = update.SetSource(items).Set(a => a.CreateTime, new DateTime(2020, 1, 1)).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET `CreateTime` = @p_0 WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))", sql);
sql = g.mysql.Insert<TestEnumUpdateTb>().AppendData(new TestEnumUpdateTb { type = TestEnumUpdateTbType.sum211 }).ToSql().Replace("\r\n", "");
@ -72,7 +78,8 @@ namespace FreeSql.Tests.MySqlConnector {
Assert.Equal(TestEnumUpdateTbType.biggit, g.mysql.Select<TestEnumUpdateTb>().Where(a => a.id == id).First()?.type);
}
[Fact]
public void IgnoreColumns() {
public void IgnoreColumns()
{
var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET `Title` = @p_0 WHERE (`Id` = 1)", sql);
@ -83,7 +90,8 @@ namespace FreeSql.Tests.MySqlConnector {
Assert.Equal("UPDATE `TestEnumUpdateTb` SET `type` = 'sum211' WHERE (`id` = 0)", sql);
}
[Fact]
public void UpdateColumns() {
public void UpdateColumns()
{
var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).UpdateColumns(a => a.Title).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET `Title` = @p_0 WHERE (`Id` = 1)", sql);
@ -94,7 +102,8 @@ namespace FreeSql.Tests.MySqlConnector {
Assert.Equal("UPDATE `TestEnumUpdateTb` SET `type` = 'sum211' WHERE (`id` = 0)", sql);
}
[Fact]
public void Set() {
public void Set()
{
var sql = update.Where(a => a.Id == 1).Set(a => a.Title, "newtitle").ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET `Title` = @p_0 WHERE (`Id` = 1)", sql);
@ -133,7 +142,8 @@ namespace FreeSql.Tests.MySqlConnector {
Assert.Equal(TestEnumUpdateTbType.str1, g.mysql.Select<TestEnumUpdateTb>().Where(a => a.id == id).First()?.type);
}
[Fact]
public void SetRaw() {
public void SetRaw()
{
var sql = update.Where(a => a.Id == 1).SetRaw("clicks = clicks + @incrClick", new { incrClick = 1 }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET clicks = clicks + @incrClick WHERE (`Id` = 1)", sql);
@ -141,7 +151,8 @@ namespace FreeSql.Tests.MySqlConnector {
Assert.Equal("UPDATE `TestEnumUpdateTb` SET `type` = 'sum211' WHERE (`id` = 0)", sql);
}
[Fact]
public void Where() {
public void Where()
{
var sql = update.Where(a => a.Id == 1).SetRaw("title='newtitle'").ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET title='newtitle' WHERE (`Id` = 1)", sql);
@ -162,20 +173,24 @@ namespace FreeSql.Tests.MySqlConnector {
Assert.Equal("UPDATE `TestEnumUpdateTb` SET `type` = 'sum211' WHERE (`id` = 0 AND `type` = 'str1')", sql);
}
[Fact]
public void WhereExists() {
public void WhereExists()
{
}
[Fact]
public void ExecuteAffrows() {
public void ExecuteAffrows()
{
}
[Fact]
public void ExecuteUpdated() {
public void ExecuteUpdated()
{
}
[Fact]
public void AsTable() {
public void AsTable()
{
Assert.Null(g.mysql.Update<Topic>().ToSql());
Assert.Equal("UPDATE `tb_topicAsTable` SET title='test' \r\nWHERE (`Id` = 1 OR `Id` = 2)", g.mysql.Update<Topic>(new[] { 1, 2 }).SetRaw("title='test'").AsTable(a => "tb_topicAsTable").ToSql());
Assert.Equal("UPDATE `tb_topicAsTable` SET title='test1' \r\nWHERE (`Id` = 1)", g.mysql.Update<Topic>(new Topic { Id = 1, Title = "test" }).SetRaw("title='test1'").AsTable(a => "tb_topicAsTable").ToSql());

View File

@ -2,9 +2,12 @@ using FreeSql.DataAnnotations;
using System;
using Xunit;
namespace FreeSql.Tests.MySqlConnectorMapType {
public class BoolNullableTest {
class BoolNullableMap {
namespace FreeSql.Tests.MySqlConnectorMapType
{
public class BoolNullableTest
{
class BoolNullableMap
{
public Guid id { get; set; }
[Column(MapType = typeof(bool))]
public bool? tobool { get; set; } = true;
@ -57,7 +60,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
public bool? tostring { get; set; } = true;
}
[Fact]
public void Bool() {
public void Bool()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -138,7 +142,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void SByte() {
public void SByte()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -219,7 +224,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void SByteNullable() {
public void SByteNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -300,7 +306,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Short() {
public void Short()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -381,7 +388,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ShortNullable() {
public void ShortNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -462,7 +470,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Int() {
public void Int()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -543,7 +552,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void IntNullable() {
public void IntNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -624,7 +634,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Long() {
public void Long()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -705,7 +716,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void LongNullable() {
public void LongNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -787,7 +799,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
}
[Fact]
public void Byte() {
public void Byte()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -868,7 +881,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ByteNullable() {
public void ByteNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -949,7 +963,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UShort() {
public void UShort()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -1030,7 +1045,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UShortNullable() {
public void UShortNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -1111,7 +1127,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UInt() {
public void UInt()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -1192,7 +1209,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UIntNullable() {
public void UIntNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -1273,7 +1291,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ULong() {
public void ULong()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -1354,7 +1373,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ULongNullable() {
public void ULongNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -1436,23 +1456,29 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
}
[Fact]
public void TimeSpan() {
public void TimeSpan()
{
}
[Fact]
public void TimeSpanNullable() {
public void TimeSpanNullable()
{
}
[Fact]
public void DateTime() {
public void DateTime()
{
}
[Fact]
public void DateTimeNullable() {
public void DateTimeNullable()
{
}
[Fact]
public void ByteArray() {
public void ByteArray()
{
}
[Fact]
public void String() {
public void String()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -1534,29 +1560,37 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
}
[Fact]
public void Guid() {
public void Guid()
{
}
[Fact]
public void GuidNullable() {
public void GuidNullable()
{
}
[Fact]
public void MygisPoint() {
public void MygisPoint()
{
}
[Fact]
public void MygisLineString() {
public void MygisLineString()
{
}
[Fact]
public void MygisPolygon() {
public void MygisPolygon()
{
}
[Fact]
public void MygisMultiPoint() {
public void MygisMultiPoint()
{
}
[Fact]
public void MygisMultiLineString() {
public void MygisMultiLineString()
{
}
[Fact]
public void MygisMultiPolygon() {
public void MygisMultiPolygon()
{
}
}
}

View File

@ -2,10 +2,13 @@ using FreeSql.DataAnnotations;
using System;
using Xunit;
namespace FreeSql.Tests.MySqlConnectorMapType {
public class BoolTest {
namespace FreeSql.Tests.MySqlConnectorMapType
{
public class BoolTest
{
class BoolMap {
class BoolMap
{
public Guid id { get; set; }
[Column(MapType = typeof(bool?))]
public bool toboolnullable { get; set; } = true;
@ -59,7 +62,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
}
[Fact]
public void BoolNullable() {
public void BoolNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -114,7 +118,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void SByte() {
public void SByte()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -169,7 +174,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void SByteNullable() {
public void SByteNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -224,7 +230,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Short() {
public void Short()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -279,7 +286,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ShortNullable() {
public void ShortNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -334,7 +342,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Int() {
public void Int()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -389,7 +398,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void IntNullable() {
public void IntNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -444,7 +454,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Long() {
public void Long()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -499,7 +510,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void LongNullable() {
public void LongNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -555,7 +567,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
}
[Fact]
public void Byte() {
public void Byte()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -610,7 +623,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ByteNullable() {
public void ByteNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -665,7 +679,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UShort() {
public void UShort()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -720,7 +735,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UShortNullable() {
public void UShortNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -775,7 +791,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UInt() {
public void UInt()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -830,7 +847,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UIntNullable() {
public void UIntNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -885,7 +903,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ULong() {
public void ULong()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -940,7 +959,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ULongNullable() {
public void ULongNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -996,23 +1016,29 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
}
[Fact]
public void TimeSpan() {
public void TimeSpan()
{
}
[Fact]
public void TimeSpanNullable() {
public void TimeSpanNullable()
{
}
[Fact]
public void DateTime() {
public void DateTime()
{
}
[Fact]
public void DateTimeNullable() {
public void DateTimeNullable()
{
}
[Fact]
public void ByteArray() {
public void ByteArray()
{
}
[Fact]
public void String() {
public void String()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -1068,29 +1094,37 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
}
[Fact]
public void Guid() {
public void Guid()
{
}
[Fact]
public void GuidNullable() {
public void GuidNullable()
{
}
[Fact]
public void MygisPoint() {
public void MygisPoint()
{
}
[Fact]
public void MygisLineString() {
public void MygisLineString()
{
}
[Fact]
public void MygisPolygon() {
public void MygisPolygon()
{
}
[Fact]
public void MygisMultiPoint() {
public void MygisMultiPoint()
{
}
[Fact]
public void MygisMultiLineString() {
public void MygisMultiLineString()
{
}
[Fact]
public void MygisMultiPolygon() {
public void MygisMultiPolygon()
{
}
}
}

View File

@ -3,9 +3,12 @@ using System;
using System.Numerics;
using Xunit;
namespace FreeSql.Tests.MySqlConnectorMapType {
public class EnumTest {
class EnumTestMap {
namespace FreeSql.Tests.MySqlConnectorMapType
{
public class EnumTest
{
class EnumTestMap
{
public Guid id { get; set; }
[Column(MapType = typeof(string))]
@ -20,7 +23,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
}
public enum ToStringMapEnum { ÖйúÈË, abc, Ïã¸Û }
[Fact]
public void EnumToString() {
public void EnumToString()
{
//insert
var orm = g.mysql;
var item = new EnumTestMap { };
@ -76,7 +80,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<EnumTestMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void EnumNullableToString() {
public void EnumNullableToString()
{
//insert
var orm = g.mysql;
var item = new EnumTestMap { };
@ -136,7 +141,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
}
[Fact]
public void EnumToInt() {
public void EnumToInt()
{
//insert
var orm = g.mysql;
var item = new EnumTestMap { };
@ -192,7 +198,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<EnumTestMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void EnumNullableToInt() {
public void EnumNullableToInt()
{
//insert
var orm = g.mysql;
var item = new EnumTestMap { };

View File

@ -3,9 +3,12 @@ using System;
using System.Numerics;
using Xunit;
namespace FreeSql.Tests.MySqlConnectorMapType {
public class ToStringTest {
class ToStringMap {
namespace FreeSql.Tests.MySqlConnectorMapType
{
public class ToStringTest
{
class ToStringMap
{
public Guid id { get; set; }
[Column(MapType = typeof(string))]
@ -35,7 +38,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
}
public enum ToStringMapEnum { ÖйúÈË, abc, Ïã¸Û }
[Fact]
public void Enum1() {
public void Enum1()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -91,7 +95,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void EnumNullable() {
public void EnumNullable()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -150,7 +155,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void BigInteger1() {
public void BigInteger1()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -206,7 +212,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void BigIntegerNullable() {
public void BigIntegerNullable()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -265,7 +272,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void TimeSpan1() {
public void TimeSpan1()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -305,7 +313,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void TimeSpanNullable() {
public void TimeSpanNullable()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -359,7 +368,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void DateTime1() {
public void DateTime1()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -399,7 +409,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void DateTimeNullable() {
public void DateTimeNullable()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -454,7 +465,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
}
[Fact]
public void Guid1() {
public void Guid1()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -497,7 +509,8 @@ namespace FreeSql.Tests.MySqlConnectorMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void GuidNullable() {
public void GuidNullable()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };

View File

@ -6,15 +6,19 @@ using System.Linq;
using System.Text;
using Xunit;
namespace FreeSql.Tests.MySqlConnector {
public class MySqlCodeFirstTest {
namespace FreeSql.Tests.MySqlConnector
{
public class MySqlCodeFirstTest
{
[Fact]
public void _字段() {
public void _字段()
{
var sql = g.mysql.CodeFirst.GetComparisonDDLStatements<2>();
g.mysql.CodeFirst.SyncStructure<2>();
var item = new 2 {
var item = new 2
{
= "测试标题",
= DateTime.Now
};
@ -25,7 +29,8 @@ namespace FreeSql.Tests.MySqlConnector {
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
}
class 2 {
class 2
{
[Column(IsPrimary = true)]
public Guid { get; set; }
@ -35,12 +40,14 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void AddUniques() {
public void AddUniques()
{
var sql = g.mysql.CodeFirst.GetComparisonDDLStatements<AddUniquesInfo>();
g.mysql.CodeFirst.SyncStructure<AddUniquesInfo>();
}
[Table(Name = "AddUniquesInfo", OldName = "AddUniquesInfo2")]
class AddUniquesInfo {
class AddUniquesInfo
{
public Guid id { get; set; }
[Column(Unique = "uk_phone")]
public string phone { get; set; }
@ -54,14 +61,16 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void AddField() {
public void AddField()
{
var sql = g.mysql.CodeFirst.GetComparisonDDLStatements<TopicAddField>();
var id = g.mysql.Insert<TopicAddField>().AppendData(new TopicAddField { }).ExecuteIdentity();
}
[Table(Name = "TopicAddField", OldName = "xxxtb.TopicAddField")]
public class TopicAddField {
public class TopicAddField
{
[Column(IsIdentity = true)]
public int? Id { get; set; }
@ -75,10 +84,12 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void GetComparisonDDLStatements() {
public void GetComparisonDDLStatements()
{
var sql = g.mysql.CodeFirst.GetComparisonDDLStatements<TableAllType>();
if (string.IsNullOrEmpty(sql) == false) {
if (string.IsNullOrEmpty(sql) == false)
{
Assert.Equal(@"CREATE TABLE IF NOT EXISTS `cccddd`.`tb_alltype` (
`Id` INT(11) NOT NULL AUTO_INCREMENT,
`testFieldBool` BIT(1) NOT NULL,
@ -135,13 +146,15 @@ namespace FreeSql.Tests.MySqlConnector {
ISelect<TableAllType> select => g.mysql.Select<TableAllType>();
[Fact]
public void CurdAllField() {
public void CurdAllField()
{
var item = new TableAllType { };
item.Id = (int)insert.AppendData(item).ExecuteIdentity();
var newitem = select.Where(a => a.Id == item.Id).ToOne();
var item2 = new TableAllType {
var item2 = new TableAllType
{
testFieldBool = true,
testFieldBoolNullable = true,
testFieldByte = 255,
@ -209,7 +222,8 @@ namespace FreeSql.Tests.MySqlConnector {
[JsonObject(MemberSerialization.OptIn), Table(Name = "tb_alltype")]
public partial class Tb_alltype {
public partial class Tb_alltype
{
[JsonProperty, Column(Name = "Id", DbType = "int(11)", IsPrimary = true, IsIdentity = true)]
public int Id { get; set; }
@ -385,7 +399,8 @@ namespace FreeSql.Tests.MySqlConnector {
internal static IFreeSql mysql => null;
public static FreeSql.ISelect<Tb_alltype> Select => mysql.Select<Tb_alltype>();
public static long Delete(int Id) {
public static long Delete(int Id)
{
var affrows = mysql.Delete<Tb_alltype>().Where(a => a.Id == Id).ExecuteAffrows();
return affrows;
}
@ -393,8 +408,10 @@ namespace FreeSql.Tests.MySqlConnector {
/// <summary>
/// 保存或添加,如果主键有值则尝试 Update如果影响的行为 0 则尝试 Insert
/// </summary>
public void Save() {
if (this.Id != default(int)) {
public void Save()
{
if (this.Id != default(int))
{
var affrows = mysql.Update<Tb_alltype>().Where(a => a.Id == Id).ExecuteAffrows();
if (affrows > 0) return;
}
@ -403,24 +420,29 @@ namespace FreeSql.Tests.MySqlConnector {
}
public enum Tb_alltypeTESTFIELDENUM1 {
public enum Tb_alltypeTESTFIELDENUM1
{
E1 = 1, E2, E3, E5
}
public enum Tb_alltypeTESTFIELDENUM1NULLABLE {
public enum Tb_alltypeTESTFIELDENUM1NULLABLE
{
E1 = 1, E2, E3, E5
}
[Flags]
public enum Tb_alltypeTESTFIELDENUM2 : long {
public enum Tb_alltypeTESTFIELDENUM2 : long
{
F1 = 1, F2 = 2, F3 = 4
}
[Flags]
public enum Tb_alltypeTESTFIELDENUM2NULLABLE : long {
public enum Tb_alltypeTESTFIELDENUM2NULLABLE : long
{
F1 = 1, F2 = 2, F3 = 4
}
[Table(Name = "tb_alltype")]
class TableAllType {
class TableAllType
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }

View File

@ -2,37 +2,46 @@ using FreeSql.DataAnnotations;
using System;
using Xunit;
namespace FreeSql.Tests.MySqlConnector {
public class MySqlAdoTest {
namespace FreeSql.Tests.MySqlConnector
{
public class MySqlAdoTest
{
[Fact]
public void Pool() {
public void Pool()
{
var t1 = g.mysql.Ado.MasterPool.StatisticsFullily;
}
[Fact]
public void SlavePools() {
public void SlavePools()
{
var t2 = g.mysql.Ado.SlavePools.Count;
}
[Fact]
public void ExecuteReader() {
public void ExecuteReader()
{
}
[Fact]
public void ExecuteArray() {
public void ExecuteArray()
{
}
[Fact]
public void ExecuteNonQuery() {
public void ExecuteNonQuery()
{
}
[Fact]
public void ExecuteScalar() {
public void ExecuteScalar()
{
}
[Fact]
public void Query() {
public void Query()
{
var t3 = g.mysql.Ado.Query<xxx>("select * from song");
var t4 = g.mysql.Ado.Query<(int, string, string)>("select * from song");
@ -41,11 +50,13 @@ namespace FreeSql.Tests.MySqlConnector {
}
[Fact]
public void QueryMultipline() {
public void QueryMultipline()
{
var t3 = g.mysql.Ado.Query<xxx, (int, string, string), dynamic>("select * from song; select * from song; select * from song");
}
class xxx {
class xxx
{
public int Id { get; set; }
public string Path { get; set; }
public string Title2 { get; set; }

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlConnectorExpression {
public class ConvertTest {
namespace FreeSql.Tests.MySqlConnectorExpression
{
public class ConvertTest
{
ISelect<Topic> select => g.mysql.Select<Topic>();
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -19,13 +22,15 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
class TestTypeInfo {
class TestTypeInfo
{
public int Guid { get; set; }
public int ParentId { get; set; }
public TestTypeParentInfo Parent { get; set; }
public string Name { get; set; }
}
class TestTypeParentInfo {
class TestTypeParentInfo
{
public int Id { get; set; }
public string Name { get; set; }
@ -33,111 +38,129 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
}
[Fact]
public void ToBoolean() {
public void ToBoolean()
{
var data = new List<object>();
data.Add(select.Where(a => (Convert.ToBoolean(a.Clicks) ? 1 : 0) > 0).ToList());
data.Add(select.Where(a => (bool.Parse(a.Clicks.ToString()) ? 1 : 0) > 0).ToList());
}
[Fact]
public void ToByte() {
public void ToByte()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToByte(a.Clicks % 255) > 0).ToList());
data.Add(select.Where(a => byte.Parse((a.Clicks % 255).ToString()) > 0).ToList());
}
[Fact]
public void ToChar() {
public void ToChar()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToChar(a.Clicks) == '1').ToList());
data.Add(select.Where(a => char.Parse(a.Clicks.ToString()) == '1').ToList());
}
[Fact]
public void ToDateTime() {
public void ToDateTime()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToDateTime(a.CreateTime.ToString()).Year > 0).ToList());
data.Add(select.Where(a => DateTime.Parse(a.CreateTime.ToString()).Year > 0).ToList());
}
[Fact]
public void ToDecimal() {
public void ToDecimal()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToDecimal(a.Clicks) > 0).ToList());
data.Add(select.Where(a => decimal.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void ToDouble() {
public void ToDouble()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToDouble(a.Clicks) > 0).ToList());
data.Add(select.Where(a => double.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void ToInt16() {
public void ToInt16()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToInt16(a.Clicks) > 0).ToList());
data.Add(select.Where(a => short.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void ToInt32() {
public void ToInt32()
{
var data = new List<object>();
data.Add(select.Where(a => (int)a.Clicks > 0).ToList());
data.Add(select.Where(a => Convert.ToInt32(a.Clicks) > 0).ToList());
data.Add(select.Where(a => int.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void ToInt64() {
public void ToInt64()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToInt64(a.Clicks) > 0).ToList());
data.Add(select.Where(a => long.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void ToSByte() {
public void ToSByte()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToSByte(a.Clicks % 128) > 0).ToList());
data.Add(select.Where(a => sbyte.Parse((a.Clicks % 128).ToString()) > 0).ToList());
}
[Fact]
public void ToSingle() {
public void ToSingle()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToSingle(a.Clicks) > 0).ToList());
data.Add(select.Where(a => float.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void this_ToString() {
public void this_ToString()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToString(a.Clicks).Equals("")).ToList());
data.Add(select.Where(a => a.Clicks.ToString().Equals("")).ToList());
}
[Fact]
public void ToUInt16() {
public void ToUInt16()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToUInt16(a.Clicks) > 0).ToList());
data.Add(select.Where(a => ushort.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void ToUInt32() {
public void ToUInt32()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToUInt32(a.Clicks) > 0).ToList());
data.Add(select.Where(a => uint.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void ToUInt64() {
public void ToUInt64()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToUInt64(a.Clicks) > 0).ToList());
data.Add(select.Where(a => ulong.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void Guid_Parse() {
public void Guid_Parse()
{
var data = new List<object>();
data.Add(select.Where(a => Guid.Parse(Guid.Empty.ToString()) == Guid.Empty).ToList());
}
[Fact]
public void Guid_NewGuid() {
public void Guid_NewGuid()
{
var data = new List<object>();
//data.Add(select.OrderBy(a => Guid.NewGuid()).Limit(10).ToList());
}
[Fact]
public void Random() {
public void Random()
{
var data = new List<object>();
data.Add(select.Where(a => new Random().Next() > a.Clicks).Limit(10).ToList());
data.Add(select.Where(a => new Random().NextDouble() > a.Clicks).Limit(10).ToList());

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlConnectorExpression {
public class DateTimeTest {
namespace FreeSql.Tests.MySqlConnectorExpression
{
public class DateTimeTest
{
ISelect<Topic> select => g.mysql.Select<Topic>();
[Table(Name = "tb_topic111333")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -20,7 +23,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
public DateTime CreateTime { get; set; }
}
[Table(Name = "TestTypeInfo333")]
class TestTypeInfo {
class TestTypeInfo
{
[Column(IsIdentity = true)]
public int Guid { get; set; }
public int ParentId { get; set; }
@ -29,7 +33,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
public DateTime Time { get; set; }
}
[Table(Name = "TestTypeParentInfo23123")]
class TestTypeParentInfo {
class TestTypeParentInfo
{
public int Id { get; set; }
public string Name { get; set; }
@ -37,7 +42,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
public DateTime Time2 { get; set; }
}
[Fact]
public void Now() {
public void Now()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Date == DateTime.Now.Date).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -45,7 +51,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (cast(date_format(a.`CreateTime`, '%Y-%m-%d') as datetime) = cast(date_format(now(), '%Y-%m-%d') as datetime))
}
[Fact]
public void UtcNow() {
public void UtcNow()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Date == DateTime.UtcNow.Date).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -53,7 +60,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (cast(date_format(a.`CreateTime`, '%Y-%m-%d') as datetime) = cast(date_format(utc_timestamp(), '%Y-%m-%d') as datetime))
}
[Fact]
public void MinValue() {
public void MinValue()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Date == DateTime.MinValue.Date).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -61,7 +69,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (cast(date_format(a.`CreateTime`, '%Y-%m-%d') as datetime) = cast(date_format(cast('0001/1/1 0:00:00' as datetime), '%Y-%m-%d') as datetime))
}
[Fact]
public void MaxValue() {
public void MaxValue()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Date == DateTime.MaxValue.Date).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -69,7 +78,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (cast(date_format(a.`CreateTime`, '%Y-%m-%d') as datetime) = cast(date_format(cast('9999/12/31 23:59:59' as datetime), '%Y-%m-%d') as datetime))
}
[Fact]
public void Date() {
public void Date()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Date == DateTime.Now.Date).ToList());
data.Add(select.Where(a => a.Type.Time.Date > DateTime.Now.Date).ToList());
@ -101,7 +111,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((timestampdiff(microsecond, cast(date_format(a__Type__Parent.`Time2`, '%Y-%m-%d') as datetime), now())) / 1000000) > 0)
}
[Fact]
public void TimeOfDay() {
public void TimeOfDay()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay == DateTime.Now.TimeOfDay).ToList());
data.Add(select.Where(a => a.Type.Time.TimeOfDay > DateTime.Now.TimeOfDay).ToList());
@ -119,7 +130,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((timestampdiff(microsecond, date_format(a__Type__Parent.`Time2`, '1970-1-1 %H:%i:%s.%f'), a__Type__Parent.`Time2`) + 62135596800000000) > (timestampdiff(microsecond, date_format(now(), '1970-1-1 %H:%i:%s.%f'), now()) + 62135596800000000))
}
[Fact]
public void DayOfWeek() {
public void DayOfWeek()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.DayOfWeek > DateTime.Now.DayOfWeek).ToList());
data.Add(select.Where(a => a.Type.Time.DayOfWeek > DateTime.Now.DayOfWeek).ToList());
@ -137,7 +149,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((dayofweek(a__Type__Parent.`Time2`) - 1) > (dayofweek(now()) - 1))
}
[Fact]
public void Day() {
public void Day()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Day > DateTime.Now.Day).ToList());
data.Add(select.Where(a => a.Type.Time.Day > DateTime.Now.Day).ToList());
@ -155,7 +168,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (dayofmonth(a__Type__Parent.`Time2`) > dayofmonth(now()))
}
[Fact]
public void DayOfYear() {
public void DayOfYear()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.DayOfYear > DateTime.Now.DayOfYear).ToList());
data.Add(select.Where(a => a.Type.Time.DayOfYear > DateTime.Now.DayOfYear).ToList());
@ -173,7 +187,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (dayofyear(a__Type__Parent.`Time2`) > dayofyear(now()))
}
[Fact]
public void Month() {
public void Month()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Month > DateTime.Now.Month).ToList());
data.Add(select.Where(a => a.Type.Time.Month > DateTime.Now.Month).ToList());
@ -191,7 +206,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (month(a__Type__Parent.`Time2`) > month(now()))
}
[Fact]
public void Year() {
public void Year()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Year > DateTime.Now.Year).ToList());
data.Add(select.Where(a => a.Type.Time.Year > DateTime.Now.Year).ToList());
@ -209,7 +225,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (year(a__Type__Parent.`Time2`) > year(now()))
}
[Fact]
public void Hour() {
public void Hour()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Hour > DateTime.Now.Hour).ToList());
data.Add(select.Where(a => a.Type.Time.Hour > DateTime.Now.Hour).ToList());
@ -227,7 +244,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (hour(a__Type__Parent.`Time2`) > hour(now()))
}
[Fact]
public void Minute() {
public void Minute()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Minute > DateTime.Now.Minute).ToList());
data.Add(select.Where(a => a.Type.Time.Minute > DateTime.Now.Minute).ToList());
@ -245,7 +263,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (minute(a__Type__Parent.`Time2`) > minute(now()))
}
[Fact]
public void Second() {
public void Second()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Second > DateTime.Now.Second).ToList());
data.Add(select.Where(a => a.Type.Time.Second > DateTime.Now.Second).ToList());
@ -263,7 +282,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (second(a__Type__Parent.`Time2`) > second(now()))
}
[Fact]
public void Millisecond() {
public void Millisecond()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Millisecond > DateTime.Now.Millisecond).ToList());
data.Add(select.Where(a => a.Type.Time.Millisecond > DateTime.Now.Millisecond).ToList());
@ -281,7 +301,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (floor(microsecond(a__Type__Parent.`Time2`) / 1000) > floor(microsecond(now()) / 1000))
}
[Fact]
public void Ticks() {
public void Ticks()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Ticks > DateTime.Now.Ticks).ToList());
data.Add(select.Where(a => a.Type.Time.Ticks > DateTime.Now.Ticks).ToList());
@ -299,7 +320,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((timestampdiff(microsecond, '1970-1-1', a__Type__Parent.`Time2`) * 10 + 621355968000000000) > (timestampdiff(microsecond, '1970-1-1', now()) * 10 + 621355968000000000))
}
[Fact]
public void Add() {
public void Add()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Add(TimeSpan.FromDays(1)) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.Add(TimeSpan.FromDays(1)) > DateTime.Now).ToList());
@ -317,7 +339,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval ((1 * 86400000000)) microsecond) > now())
}
[Fact]
public void AddDays() {
public void AddDays()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddDays(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddDays(1) > DateTime.Now).ToList());
@ -335,7 +358,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) day) > now())
}
[Fact]
public void AddHours() {
public void AddHours()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddHours(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddHours(1) > DateTime.Now).ToList());
@ -353,7 +377,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) hour) > now())
}
[Fact]
public void AddMilliseconds() {
public void AddMilliseconds()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddMilliseconds(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddMilliseconds(1) > DateTime.Now).ToList());
@ -371,7 +396,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) * 1000 microsecond) > now())
}
[Fact]
public void AddMinutes() {
public void AddMinutes()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddMinutes(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddMinutes(1) > DateTime.Now).ToList());
@ -389,7 +415,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) minute) > now())
}
[Fact]
public void AddMonths() {
public void AddMonths()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddMonths(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddMonths(1) > DateTime.Now).ToList());
@ -407,7 +434,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) month) > now())
}
[Fact]
public void AddSeconds() {
public void AddSeconds()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddSeconds(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddSeconds(1) > DateTime.Now).ToList());
@ -425,7 +453,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) second) > now())
}
[Fact]
public void AddTicks() {
public void AddTicks()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddTicks(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddTicks(1) > DateTime.Now).ToList());
@ -443,7 +472,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) / 10 microsecond) > now())
}
[Fact]
public void AddYears() {
public void AddYears()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddYears(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddYears(1) > DateTime.Now).ToList());
@ -461,7 +491,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) year) > now())
}
[Fact]
public void Subtract() {
public void Subtract()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Subtract(DateTime.Now).TotalSeconds > 0).ToList());
data.Add(select.Where(a => a.Type.Time.Subtract(DateTime.Now).TotalSeconds > 0).ToList());
@ -493,7 +524,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (date_sub(a__Type__Parent.`Time2`, interval ((1 * 86400000000)) microsecond) > a.`CreateTime`)
}
[Fact]
public void this_Equals() {
public void this_Equals()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddYears(1).Equals(DateTime.Now)).ToList());
data.Add(select.Where(a => a.Type.Time.AddYears(1).Equals(DateTime.Now)).ToList());
@ -511,7 +543,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((date_add(a__Type__Parent.`Time2`, interval (1) year) = now()))
}
[Fact]
public void this_ToString() {
public void this_ToString()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.ToString().Equals(DateTime.Now)).ToList());
data.Add(select.Where(a => a.Type.Time.AddYears(1).ToString().Equals(DateTime.Now)).ToList());
@ -530,7 +563,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
}
[Fact]
public void DateTime_Compare() {
public void DateTime_Compare()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.CompareTo(DateTime.Now) == 0).ToList());
data.Add(select.Where(a => a.Type.Time.AddYears(1).CompareTo(DateTime.Now) == 0).ToList());
@ -548,7 +582,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((date_add(a__Type__Parent.`Time2`, interval (1) year)) - (now())) = 0)
}
[Fact]
public void DateTime_DaysInMonth() {
public void DateTime_DaysInMonth()
{
var data = new List<object>();
data.Add(select.Where(a => DateTime.DaysInMonth(a.CreateTime.Year, a.CreateTime.Month) > 30).ToList());
data.Add(select.Where(a => DateTime.DaysInMonth(a.Type.Time.Year, a.Type.Time.Month) > 30).ToList());
@ -566,7 +601,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (dayofmonth(last_day(concat(year(a__Type__Parent.`Time2`), month(a__Type__Parent.`Time2`), '-01'))) > 30)
}
[Fact]
public void DateTime_Equals() {
public void DateTime_Equals()
{
var data = new List<object>();
data.Add(select.Where(a => DateTime.Equals(a.CreateTime.AddYears(1), DateTime.Now)).ToList());
data.Add(select.Where(a => DateTime.Equals(a.Type.Time.AddYears(1), DateTime.Now)).ToList());
@ -584,7 +620,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((date_add(a__Type__Parent.`Time2`, interval (1) year) = now()))
}
[Fact]
public void DateTime_IsLeapYear() {
public void DateTime_IsLeapYear()
{
var data = new List<object>();
data.Add(select.Where(a => DateTime.IsLeapYear(a.CreateTime.Year)).ToList());
data.Add(select.Where(a => DateTime.IsLeapYear(a.Type.Time.AddYears(1).Year)).ToList());
@ -602,7 +639,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((year(date_add(a__Type__Parent.`Time2`, interval (1) year))) % 4 = 0 AND (year(date_add(a__Type__Parent.`Time2`, interval (1) year))) % 100 <> 0 OR (year(date_add(a__Type__Parent.`Time2`, interval (1) year))) % 400 = 0))
}
[Fact]
public void DateTime_Parse() {
public void DateTime_Parse()
{
var data = new List<object>();
data.Add(select.Where(a => DateTime.Parse(a.CreateTime.ToString()) > DateTime.Now).ToList());
data.Add(select.Where(a => DateTime.Parse(a.Type.Time.AddYears(1).ToString()) > DateTime.Now).ToList());

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlConnectorExpression {
public class MathTest {
namespace FreeSql.Tests.MySqlConnectorExpression
{
public class MathTest
{
ISelect<Topic> select => g.mysql.Select<Topic>();
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -19,13 +22,15 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
class TestTypeInfo {
class TestTypeInfo
{
public int Guid { get; set; }
public int ParentId { get; set; }
public TestTypeParentInfo Parent { get; set; }
public string Name { get; set; }
}
class TestTypeParentInfo {
class TestTypeParentInfo
{
public int Id { get; set; }
public string Name { get; set; }
@ -33,98 +38,117 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
}
[Fact]
public void PI() {
public void PI()
{
var data = new List<object>();
data.Add(select.Where(a => Math.PI + a.Clicks > 0).ToList());
}
[Fact]
public void Abs() {
public void Abs()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Abs(-a.Clicks) > 0).ToList());
}
[Fact]
public void Sign() {
public void Sign()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Sign(-a.Clicks) > 0).ToList());
}
[Fact]
public void Floor() {
public void Floor()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Floor(a.Clicks + 0.5) == a.Clicks).ToList());
}
[Fact]
public void Ceiling() {
public void Ceiling()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Ceiling(a.Clicks + 0.5) == a.Clicks + 1).ToList());
}
[Fact]
public void Round() {
public void Round()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Round(a.Clicks + 0.5) == a.Clicks).ToList());
data.Add(select.Where(a => Math.Round(a.Clicks + 0.5, 1) > a.Clicks).ToList());
}
[Fact]
public void Exp() {
public void Exp()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Exp(1) == a.Clicks + 1).ToList());
}
[Fact]
public void Log() {
public void Log()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Log(a.Clicks + 0.5) == a.Clicks + 1).ToList());
}
[Fact]
public void Log10() {
public void Log10()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Log10(a.Clicks + 0.5) == a.Clicks + 1).ToList());
}
[Fact]
public void Pow() {
public void Pow()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Pow(2, a.Clicks) == a.Clicks + 1).ToList());
}
[Fact]
public void Sqrt() {
public void Sqrt()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Sqrt(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList());
}
[Fact]
public void Cos() {
public void Cos()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Cos(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList());
}
[Fact]
public void Sin() {
public void Sin()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Sin(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList());
}
[Fact]
public void Tan() {
public void Tan()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Tan(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList());
}
[Fact]
public void Acos() {
public void Acos()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Acos(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList());
}
[Fact]
public void Asin() {
public void Asin()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Asin(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList());
}
[Fact]
public void Atan() {
public void Atan()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Atan(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList());
}
[Fact]
public void Atan2() {
public void Atan2()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Atan2(2, a.Clicks) == a.Clicks + 1).ToList());
}
[Fact]
public void Truncate() {
public void Truncate()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Truncate(a.Clicks * 1.0 / 3) == a.Clicks + 1).ToList());
}

View File

@ -5,17 +5,21 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlConnectorExpression {
public class OtherTest {
namespace FreeSql.Tests.MySqlConnectorExpression
{
public class OtherTest
{
ISelect<TableAllType> select => g.mysql.Select<TableAllType>();
public OtherTest() {
public OtherTest()
{
}
[Fact]
public void Boolean() {
public void Boolean()
{
var t1 = select.Where(a => a.testFieldBool == true).ToList();
var t2 = select.Where(a => a.testFieldBool != true).ToList();
var t3 = select.Where(a => a.testFieldBool == false).ToList();
@ -30,7 +34,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
}
[Fact]
public void Array() {
public void Array()
{
int[] nullarr = null;
Assert.Throws<MySqlException>(() => { select.Where(a => nullarr.Contains(a.testFieldInt)).ToList(); });
Assert.Throws<MySqlException>(() => { select.Where(a => new int[0].Contains(a.testFieldInt)).ToList(); });
@ -64,7 +69,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
}
[Table(Name = "tb_alltype")]
class TableAllType {
class TableAllType
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlConnectorExpression {
public class StringTest {
namespace FreeSql.Tests.MySqlConnectorExpression
{
public class StringTest
{
ISelect<Topic> select => g.mysql.Select<Topic>();
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -19,26 +22,30 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
class TestTypeInfo {
class TestTypeInfo
{
[Column(IsIdentity = true)]
public int Guid { get; set; }
public int ParentId { get; set; }
public TestTypeParentInfo Parent { get; set; }
public string Name { get; set; }
}
class TestTypeParentInfo {
class TestTypeParentInfo
{
public int Id { get; set; }
public string Name { get; set; }
public List<TestTypeInfo> Types { get; set; }
}
class TestEqualsGuid {
class TestEqualsGuid
{
public Guid id { get; set; }
public bool IsDeleted { get; set; }
}
[Fact]
public void Equals__() {
public void Equals__()
{
var list = new List<object>();
list.Add(select.Where(a => a.Title.Equals("aaa")).ToList());
list.Add(g.mysql.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
@ -46,7 +53,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
}
[Fact]
public void Empty() {
public void Empty()
{
var data = new List<object>();
data.Add(select.Where(a => (a.Title ?? "") == string.Empty).ToSql());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -55,7 +63,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
}
[Fact]
public void StartsWith() {
public void StartsWith()
{
var list = new List<object>();
list.Add(select.Where(a => a.Title.StartsWith("aaa")).ToList());
list.Add(select.Where(a => a.Title.StartsWith(a.Title)).ToList());
@ -97,7 +106,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE((concat(a.`Title`, 'aaa')) LIKE concat('%', a__Type.`Name`))
}
[Fact]
public void EndsWith() {
public void EndsWith()
{
var list = new List<object>();
list.Add(select.Where(a => a.Title.EndsWith("aaa")).ToList());
list.Add(select.Where(a => a.Title.EndsWith(a.Title)).ToList());
@ -139,7 +149,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE((concat(a.`Title`, 'aaa')) LIKE concat(a__Type.`Name`, '%'))
}
[Fact]
public void Contains() {
public void Contains()
{
var list = new List<object>();
list.Add(select.Where(a => a.Title.Contains("aaa")).ToList());
list.Add(select.Where(a => a.Title.Contains(a.Title)).ToList());
@ -181,7 +192,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE((concat(a.`Title`, 'aaa')) LIKE concat('%', a__Type.`Name`, '%'))
}
[Fact]
public void ToLower() {
public void ToLower()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.ToLower() == "aaa").ToList());
data.Add(select.Where(a => a.Title.ToLower() == a.Title).ToList());
@ -223,7 +235,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE(lower(concat(lower(a.`Title`), 'aaa')) = a__Type.`Name`)
}
[Fact]
public void ToUpper() {
public void ToUpper()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.ToUpper() == "aaa").ToList());
data.Add(select.Where(a => a.Title.ToUpper() == a.Title).ToList());
@ -265,7 +278,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (upper(concat(upper(a.`Title`), 'aaa')) = a__Type.`Name`)
}
[Fact]
public void Substring() {
public void Substring()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.Substring(0) == "aaa").ToList());
data.Add(select.Where(a => a.Title.Substring(0) == a.Title).ToList());
@ -307,7 +321,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (substr(concat(substr(a.`Title`, 1), 'aaa'), 2, 2) = a__Type.`Name`)
}
[Fact]
public void Length() {
public void Length()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.Length == 0).ToList());
data.Add(select.Where(a => a.Title.Length == 1).ToList());
@ -349,7 +364,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (char_length(concat(a.`Title`, 'aaa')) = char_length(a__Type.`Name`))
}
[Fact]
public void IndexOf() {
public void IndexOf()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.IndexOf("aaa") == -1).ToList());
data.Add(select.Where(a => a.Title.IndexOf("aaa", 2) == -1).ToList());
@ -391,7 +407,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((locate(concat(a.`Title`, 'aaa'), 'aaa', 3) - 1) = char_length(a__Type.`Name`) + 1)
}
[Fact]
public void PadLeft() {
public void PadLeft()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.PadLeft(10, 'a') == "aaa").ToList());
data.Add(select.Where(a => a.Title.PadLeft(10, 'a') == a.Title).ToList());
@ -433,7 +450,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (lpad(concat(lpad(a.`Title`, 10, 'a'), 'aaa'), 20, 'b') = a__Type.`Name`)
}
[Fact]
public void PadRight() {
public void PadRight()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.PadRight(10, 'a') == "aaa").ToList());
data.Add(select.Where(a => a.Title.PadRight(10, 'a') == a.Title).ToList());
@ -475,7 +493,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (rpad(concat(rpad(a.`Title`, 10, 'a'), 'aaa'), 20, 'b') = a__Type.`Name`)
}
[Fact]
public void Trim() {
public void Trim()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.Trim() == "aaa").ToList());
data.Add(select.Where(a => a.Title.Trim('a') == a.Title).ToList());
@ -517,7 +536,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (trim('c' from trim('b' from trim('a' from concat(trim('c' from trim('b' from trim('a' from a.`Title`))), 'aaa')))) = a__Type.`Name`)
}
[Fact]
public void TrimStart() {
public void TrimStart()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.TrimStart() == "aaa").ToList());
data.Add(select.Where(a => a.Title.TrimStart('a') == a.Title).ToList());
@ -559,7 +579,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (trim(trailing 'c' from trim(leading 'c' from trim(trailing 'b' from trim(leading 'b' from trim(trailing 'a' from trim(leading 'a' from concat(trim(trailing 'c' from trim(leading 'c' from trim(trailing 'b' from trim(leading 'b' from trim(trailing 'a' from trim(leading 'a' from a.`Title`)))))), 'aaa'))))))) = a__Type.`Name`)
}
[Fact]
public void TrimEnd() {
public void TrimEnd()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.TrimEnd() == "aaa").ToList());
data.Add(select.Where(a => a.Title.TrimEnd('a') == a.Title).ToList());
@ -601,7 +622,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (trim(trailing 'c' from trim(trailing 'b' from trim(trailing 'a' from concat(trim(trailing 'c' from trim(trailing 'b' from trim(trailing 'a' from a.`Title`))), 'aaa')))) = a__Type.`Name`)
}
[Fact]
public void Replace() {
public void Replace()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.Replace("a", "b") == "aaa").ToList());
data.Add(select.Where(a => a.Title.Replace("a", "b").Replace("b", "c") == a.Title).ToList());
@ -643,7 +665,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (concat(replace(replace(replace(a.`Title`, 'a', 'b'), 'b', 'c'), a__Type.`Name`, 'a'), 'aaa') = a__Type.`Name`)
}
[Fact]
public void CompareTo() {
public void CompareTo()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.CompareTo(a.Title) == 0).ToList());
data.Add(select.Where(a => a.Title.CompareTo(a.Title) > 0).ToList());
@ -686,7 +709,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
}
[Fact]
public void string_IsNullOrEmpty() {
public void string_IsNullOrEmpty()
{
var data = new List<object>();
data.Add(select.Where(a => string.IsNullOrEmpty(a.Title)).ToList());
data.Add(select.Where(a => string.IsNullOrEmpty(a.Title) == false).ToList());

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlConnectorExpression {
public class TimeSpanTest {
namespace FreeSql.Tests.MySqlConnectorExpression
{
public class TimeSpanTest
{
ISelect<Topic> select => g.mysql.Select<Topic>();
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -19,20 +22,23 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
class TestTypeInfo {
class TestTypeInfo
{
public int Guid { get; set; }
public int ParentId { get; set; }
public TestTypeParentInfo Parent { get; set; }
public string Name { get; set; }
}
class TestTypeParentInfo {
class TestTypeParentInfo
{
public int Id { get; set; }
public string Name { get; set; }
public List<TestTypeInfo> Types { get; set; }
}
[Fact]
public void Zero() {
public void Zero()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay > TimeSpan.Zero).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -40,7 +46,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) > 0)
}
[Fact]
public void MinValue() {
public void MinValue()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay > TimeSpan.MinValue).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -48,7 +55,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) > -922337203685477580)
}
[Fact]
public void MaxValue() {
public void MaxValue()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay < TimeSpan.MaxValue).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -56,7 +64,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) < 922337203685477580)
}
[Fact]
public void Days() {
public void Days()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Days == 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -64,7 +73,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 86400000000) = 0)
}
[Fact]
public void Hours() {
public void Hours()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Hours > 0).ToSql());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -72,7 +82,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 3600000000) mod 24 > 0)
}
[Fact]
public void Milliseconds() {
public void Milliseconds()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Milliseconds > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -80,7 +91,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 1000 mod 1000) > 0)
}
[Fact]
public void Minutes() {
public void Minutes()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Minutes > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -88,7 +100,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 60000000 mod 60) > 0)
}
[Fact]
public void Seconds() {
public void Seconds()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Seconds > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -96,7 +109,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 1000000 mod 60) > 0)
}
[Fact]
public void Ticks() {
public void Ticks()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Ticks > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -104,7 +118,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) * 10) > 0)
}
[Fact]
public void TotalDays() {
public void TotalDays()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalDays > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -112,7 +127,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 86400000000) > 0)
}
[Fact]
public void TotalHours() {
public void TotalHours()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalHours > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -120,7 +136,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 3600000000) > 0)
}
[Fact]
public void TotalMilliseconds() {
public void TotalMilliseconds()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalMilliseconds > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -128,7 +145,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 1000) > 0)
}
[Fact]
public void TotalMinutes() {
public void TotalMinutes()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalMinutes > 0).ToSql());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -136,7 +154,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 60000000) > 0)
}
[Fact]
public void TotalSeconds() {
public void TotalSeconds()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalSeconds > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -144,7 +163,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 1000000) > 0)
}
[Fact]
public void Add() {
public void Add()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Add(TimeSpan.FromDays(1)) > TimeSpan.Zero).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -152,7 +172,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) + (1 * 86400000000)) > 0)
}
[Fact]
public void Subtract() {
public void Subtract()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Subtract(TimeSpan.FromDays(1)) > TimeSpan.Zero).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -160,7 +181,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) - (1 * 86400000000)) > 0)
}
[Fact]
public void CompareTo() {
public void CompareTo()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.CompareTo(TimeSpan.FromDays(1)) > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -168,7 +190,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) - ((1 * 86400000000))) > 0)
}
[Fact]
public void this_Equals() {
public void this_Equals()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Equals(TimeSpan.FromDays(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -176,7 +199,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 86400000000)))
}
[Fact]
public void this_ToString() {
public void this_ToString()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.ToString() == "ssss").ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -185,7 +209,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
}
[Fact]
public void TimeSpan_Compare() {
public void TimeSpan_Compare()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Compare(a.CreateTime.TimeOfDay, TimeSpan.FromDays(1)) > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -193,7 +218,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) - ((1 * 86400000000))) > 0)
}
[Fact]
public void TimeSpan_Equals() {
public void TimeSpan_Equals()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromDays(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -201,7 +227,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 86400000000)))
}
[Fact]
public void TimeSpan_FromDays() {
public void TimeSpan_FromDays()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromDays(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -209,7 +236,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 86400000000)))
}
[Fact]
public void TimeSpan_FromHours() {
public void TimeSpan_FromHours()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromHours(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -217,7 +245,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 3600000000)))
}
[Fact]
public void TimeSpan_FromMilliseconds() {
public void TimeSpan_FromMilliseconds()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromMilliseconds(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -225,7 +254,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 1000)))
}
[Fact]
public void TimeSpan_FromMinutes() {
public void TimeSpan_FromMinutes()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromMinutes(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -233,7 +263,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 60000000)))
}
[Fact]
public void TimeSpan_FromSeconds() {
public void TimeSpan_FromSeconds()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromSeconds(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -241,7 +272,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 1000000)))
}
[Fact]
public void TimeSpan_FromTicks() {
public void TimeSpan_FromTicks()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromTicks(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -249,7 +281,8 @@ namespace FreeSql.Tests.MySqlConnectorExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 / 10)))
}
[Fact]
public void TimeSpan_Parse() {
public void TimeSpan_Parse()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Parse(a.CreateTime.TimeOfDay.ToString()) > TimeSpan.Zero).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5

View File

@ -2,17 +2,21 @@ using FreeSql.DataAnnotations;
using System;
using Xunit;
namespace FreeSql.Tests.MySqlConnector {
public class MySqlDbFirstTest {
namespace FreeSql.Tests.MySqlConnector
{
public class MySqlDbFirstTest
{
[Fact]
public void GetDatabases() {
public void GetDatabases()
{
var t1 = g.mysql.DbFirst.GetDatabases();
}
[Fact]
public void GetTablesByDatabase() {
public void GetTablesByDatabase()
{
var t2 = g.mysql.DbFirst.GetTablesByDatabase(g.mysql.DbFirst.GetDatabases()[0]);

View File

@ -4,16 +4,19 @@ using System.Diagnostics;
using System.Text;
public class g {
public class g
{
static Lazy<IFreeSql> mysqlLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd_mysqlconnector;Charset=utf8;SslMode=none;Max pool size=10")
.UseAutoSyncStructure(true)
.UseMonitorCommand(
cmd => {
cmd =>
{
Trace.WriteLine(cmd.CommandText);
}, //监听SQL命令对象在执行前
(cmd, traceLog) => {
(cmd, traceLog) =>
{
Console.WriteLine(traceLog);
}) //监听SQL命令对象在执行后
.UseLazyLoading(true)

View File

@ -4,40 +4,51 @@ using System;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.DataAnnotations {
public class MySqlFluentTest {
namespace FreeSql.Tests.DataAnnotations
{
public class MySqlFluentTest
{
public MySqlFluentTest() {
public MySqlFluentTest()
{
}
[Fact]
public void DisableSyncStructure() {
public void DisableSyncStructure()
{
Assert.Throws<MySqlException>(() => g.mysql.Select<ModelDisableSyncStructure>().ToList());
g.mysql.Select<ModelSyncStructure>().ToList();
}
[Table(DisableSyncStructure = true)]
class ModelDisableSyncStructure {
class ModelDisableSyncStructure
{
[Column(IsPrimary = false)]
public int pkid { get; set; }
}
class ModelSyncStructure {
class ModelSyncStructure
{
[Column(IsPrimary = false)]
public int pkid { get; set; }
}
[Fact]
public void AopConfigEntity() {
public void AopConfigEntity()
{
g.mysql.CodeFirst.ConfigEntity<ModelAopConfigEntity>(a => a.Property(b => b.pkid).IsPrimary(true));
g.mysql.Aop.ConfigEntity = (s, e) => {
g.mysql.Aop.ConfigEntity = (s, e) =>
{
var attr = e.EntityType.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.Schema.TableAttribute), false).FirstOrDefault() as System.ComponentModel.DataAnnotations.Schema.TableAttribute;
if (attr != null) {
if (attr != null)
{
e.ModifyResult.Name = attr.Name;
}
};
g.mysql.Aop.ConfigEntityProperty = (s, e) => {
if (e.Property.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.KeyAttribute), false).Any()) {
g.mysql.Aop.ConfigEntityProperty = (s, e) =>
{
if (e.Property.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.KeyAttribute), false).Any())
{
e.ModifyResult.IsPrimary = true;
}
};
@ -45,14 +56,16 @@ namespace FreeSql.Tests.DataAnnotations {
var tsql1 = g.mysql.Select<ModelAopConfigEntity>().WhereDynamic(1).ToSql();
}
[System.ComponentModel.DataAnnotations.Schema.Table("xxx")]
class ModelAopConfigEntity {
class ModelAopConfigEntity
{
[System.ComponentModel.DataAnnotations.Key]
[Column(IsPrimary = false)]
public int pkid { get; set; }
}
[Fact]
public void Fluent() {
public void Fluent()
{
g.mysql.CodeFirst
//.ConfigEntity<TestFluenttb1>(a => {
// a.Name("xxdkdkdk1").SelectFilter("a.Id22 > 0");
@ -60,13 +73,15 @@ namespace FreeSql.Tests.DataAnnotations {
// a.Property(b => b.name).DbType("varchar(100)").IsNullable(true);
//})
.ConfigEntity(typeof(TestFluenttb1), a => {
.ConfigEntity(typeof(TestFluenttb1), a =>
{
a.Name("xxdkdkdk1222").SelectFilter("a.Id22dd > 1");
a.Property("Id").Name("Id22dd").IsIdentity(true);
a.Property("Name").DbType("varchar(101)").IsNullable(true);
})
.ConfigEntity<TestFluenttb2>(a => {
.ConfigEntity<TestFluenttb2>(a =>
{
a.Name("xxdkdkdk2").SelectFilter("a.Idx > 0");
a.Property(b => b.Id).Name("Id22").IsIdentity(true);
a.Property(b => b.name).DbType("varchar(100)").IsNullable(true);
@ -101,7 +116,8 @@ namespace FreeSql.Tests.DataAnnotations {
}
[Fact]
public void IsIgnore() {
public void IsIgnore()
{
var item = new TestIsIgnore { };
Assert.Equal(1, g.mysql.Insert<TestIsIgnore>().AppendData(item).ExecuteAffrows());
@ -110,7 +126,8 @@ namespace FreeSql.Tests.DataAnnotations {
Assert.Equal(item.id, find.id);
}
class TestIsIgnore {
class TestIsIgnore
{
public Guid id { get; set; }
[Column(IsIgnore = true)]

View File

@ -4,9 +4,11 @@ using System;
using System.Data.SqlClient;
using Xunit;
namespace FreeSql.Tests.DataAnnotations {
namespace FreeSql.Tests.DataAnnotations
{
[Collection("SqlServerCollection")]
public class SqlServerFluentTest {
public class SqlServerFluentTest
{
SqlServerFixture _sqlserverFixture;
@ -16,23 +18,27 @@ namespace FreeSql.Tests.DataAnnotations {
}
[Fact]
public void DisableSyncStructure() {
public void DisableSyncStructure()
{
Assert.Throws<SqlException>(() => _sqlserverFixture.SqlServer.Select<ModelDisableSyncStructure>().ToList());
_sqlserverFixture.SqlServer.Select<ModelSyncStructure>().ToList();
}
[Table(DisableSyncStructure = true)]
class ModelDisableSyncStructure {
class ModelDisableSyncStructure
{
[Column(IsPrimary = false)]
public int pkid { get; set; }
}
class ModelSyncStructure {
class ModelSyncStructure
{
[Column(IsPrimary = false)]
public int pkid { get; set; }
}
[Fact]
public void Fluent() {
public void Fluent()
{
_sqlserverFixture.SqlServer.CodeFirst
//.ConfigEntity<TestFluenttb1>(a => {
// a.Name("xxdkdkdk1").SelectFilter("a.Id22 > 0");
@ -40,13 +46,15 @@ namespace FreeSql.Tests.DataAnnotations {
// a.Property(b => b.name).DbType("varchar(100)").IsNullable(true);
//})
.ConfigEntity(typeof(TestFluenttb1), a => {
.ConfigEntity(typeof(TestFluenttb1), a =>
{
a.Name("xxdkdkdk1222").SelectFilter("a.Id22dd > 1");
a.Property("Id").Name("Id22dd").IsIdentity(true);
a.Property("Name").DbType("varchar(101)").IsNullable(true);
})
.ConfigEntity<TestFluenttb2>(a => {
.ConfigEntity<TestFluenttb2>(a =>
{
a.Name("xxdkdkdk2").SelectFilter("a.Idx > 0");
a.Property(b => b.Id).Name("Id22").IsIdentity(true);
a.Property(b => b.name).DbType("varchar(100)").IsNullable(true);
@ -65,7 +73,8 @@ namespace FreeSql.Tests.DataAnnotations {
}
[Fact]
public void GroupPrimaryKey() {
public void GroupPrimaryKey()
{
_sqlserverFixture.SqlServer.CodeFirst.SyncStructure<TestgroupkeyTb>();
g.mysql.CodeFirst.SyncStructure<TestgroupkeyTb>();
g.pgsql.CodeFirst.SyncStructure<TestgroupkeyTb>();
@ -90,7 +99,8 @@ namespace FreeSql.Tests.DataAnnotations {
}
[Table(Name = "test_groupkey")]
class TestgroupkeyTb {
class TestgroupkeyTb
{
[Column(IsPrimary = true)]
public int Id { get; set; }
[Column(IsPrimary = true)]
@ -101,7 +111,8 @@ namespace FreeSql.Tests.DataAnnotations {
}
[Fact]
public void IsIgnore() {
public void IsIgnore()
{
var item = new TestIsIgnore { };
Assert.Equal(1, _sqlserverFixture.SqlServer.Insert<TestIsIgnore>().AppendData(item).ExecuteAffrows());
@ -110,7 +121,8 @@ namespace FreeSql.Tests.DataAnnotations {
Assert.Equal(item.id, find.id);
}
class TestIsIgnore {
class TestIsIgnore
{
public Guid id { get; set; }
[Column(IsIgnore = true)]

View File

@ -10,11 +10,14 @@ using Npgsql.LegacyPostgis;
using FreeSql.Internal;
using System.Linq.Expressions;
namespace FreeSql.ExpressionTree {
public class GetDataReaderValueBlockExpressionTest {
namespace FreeSql.ExpressionTree
{
public class GetDataReaderValueBlockExpressionTest
{
[Fact]
public void Guid2() {
public void Guid2()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(Guid), Expression.Constant(Guid.Empty));
Assert.Equal(Guid.Empty, Utils.GetDataReaderValue(typeof(Guid), Guid.Empty));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(Guid), Expression.Constant(Guid.NewGuid()));
@ -46,7 +49,8 @@ namespace FreeSql.ExpressionTree {
}
[Fact]
public void Boolean() {
public void Boolean()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(bool), Expression.Constant(true));
Assert.Equal(true, Utils.GetDataReaderValue(typeof(bool), true));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(bool), Expression.Constant(false));
@ -79,7 +83,8 @@ namespace FreeSql.ExpressionTree {
}
[Fact]
public void SByte() {
public void SByte()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(sbyte), Expression.Constant(sbyte.MinValue));
Assert.Equal(sbyte.MinValue, Utils.GetDataReaderValue(typeof(sbyte), sbyte.MinValue));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(sbyte), Expression.Constant(sbyte.MaxValue));
@ -106,7 +111,8 @@ namespace FreeSql.ExpressionTree {
}
[Fact]
public void Short() {
public void Short()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(short), Expression.Constant(short.MinValue));
Assert.Equal(short.MinValue, Utils.GetDataReaderValue(typeof(short), short.MinValue));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(short), Expression.Constant(short.MaxValue));
@ -133,7 +139,8 @@ namespace FreeSql.ExpressionTree {
}
[Fact]
public void Int() {
public void Int()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(int), Expression.Constant(int.MinValue));
Assert.Equal(int.MinValue, Utils.GetDataReaderValue(typeof(int), int.MinValue));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(int), Expression.Constant(int.MaxValue));
@ -160,7 +167,8 @@ namespace FreeSql.ExpressionTree {
}
[Fact]
public void Long() {
public void Long()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(long), Expression.Constant(long.MinValue));
Assert.Equal(long.MinValue, Utils.GetDataReaderValue(typeof(long), long.MinValue));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(long), Expression.Constant(long.MaxValue));
@ -187,7 +195,8 @@ namespace FreeSql.ExpressionTree {
}
[Fact]
public void Byte() {
public void Byte()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(byte), Expression.Constant(byte.MinValue));
Assert.Equal(byte.MinValue, Utils.GetDataReaderValue(typeof(byte), byte.MinValue));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(byte), Expression.Constant(byte.MaxValue));
@ -214,7 +223,8 @@ namespace FreeSql.ExpressionTree {
}
[Fact]
public void UShort() {
public void UShort()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(ushort), Expression.Constant(ushort.MinValue));
Assert.Equal(ushort.MinValue, Utils.GetDataReaderValue(typeof(ushort), ushort.MinValue));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(ushort), Expression.Constant(ushort.MaxValue));
@ -241,7 +251,8 @@ namespace FreeSql.ExpressionTree {
}
[Fact]
public void UInt() {
public void UInt()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(uint), Expression.Constant(uint.MinValue));
Assert.Equal(uint.MinValue, Utils.GetDataReaderValue(typeof(uint), uint.MinValue));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(uint), Expression.Constant(uint.MaxValue));
@ -268,7 +279,8 @@ namespace FreeSql.ExpressionTree {
}
[Fact]
public void ULong() {
public void ULong()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(ulong), Expression.Constant(ulong.MinValue));
Assert.Equal(ulong.MinValue, Utils.GetDataReaderValue(typeof(ulong), ulong.MinValue));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(ulong), Expression.Constant(ulong.MaxValue));
@ -295,7 +307,8 @@ namespace FreeSql.ExpressionTree {
}
[Fact]
public void Float() {
public void Float()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(float), Expression.Constant(float.MinValue));
Assert.Equal(float.MinValue, Utils.GetDataReaderValue(typeof(float), float.MinValue));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(float), Expression.Constant(float.MaxValue));
@ -322,7 +335,8 @@ namespace FreeSql.ExpressionTree {
}
[Fact]
public void Double() {
public void Double()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(double), Expression.Constant(double.MinValue));
Assert.Equal(double.MinValue, Utils.GetDataReaderValue(typeof(double), double.MinValue));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(double), Expression.Constant(double.MaxValue));
@ -349,7 +363,8 @@ namespace FreeSql.ExpressionTree {
}
[Fact]
public void Decimal() {
public void Decimal()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(decimal), Expression.Constant(decimal.MinValue));
Assert.Equal(decimal.MinValue, Utils.GetDataReaderValue(typeof(decimal), decimal.MinValue));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(decimal), Expression.Constant(decimal.MaxValue));
@ -376,7 +391,8 @@ namespace FreeSql.ExpressionTree {
}
[Fact]
public void DateTime2() {
public void DateTime2()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(DateTime), Expression.Constant(DateTime.MinValue));
Assert.Equal(DateTime.MinValue, Utils.GetDataReaderValue(typeof(DateTime), DateTime.MinValue));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(DateTime), Expression.Constant(DateTime.MaxValue));
@ -403,7 +419,8 @@ namespace FreeSql.ExpressionTree {
}
[Fact]
public void DateTimeOffset2() {
public void DateTimeOffset2()
{
var exp1 = Utils.GetDataReaderValueBlockExpression(typeof(DateTimeOffset), Expression.Constant(DateTimeOffset.MinValue));
Assert.Equal(DateTimeOffset.MinValue, Utils.GetDataReaderValue(typeof(DateTimeOffset), DateTimeOffset.MinValue));
var exp2 = Utils.GetDataReaderValueBlockExpression(typeof(DateTimeOffset), Expression.Constant(DateTimeOffset.MaxValue));

View File

@ -3,11 +3,14 @@ using System.Collections.Generic;
using System.Linq.Expressions;
using Xunit;
namespace FreeSql.Tests.Extensions {
public class LambadaExpressionExtensionsTest {
namespace FreeSql.Tests.Extensions
{
public class LambadaExpressionExtensionsTest
{
[Fact]
public void And() {
public void And()
{
Expression<Func<testExpAddOr, bool>> where = a => a.id == Guid.Empty;
Assert.Equal("SELECT a.\"id\", a.\"num\" FROM \"testExpAddOr\" a WHERE (a.\"id\" = '00000000-0000-0000-0000-000000000000' AND a.\"num\" > 0)", g.sqlite.Select<testExpAddOr>().Where(where.And(b => b.num > 0)).ToSql().Replace("\r\n", ""));
@ -17,7 +20,8 @@ namespace FreeSql.Tests.Extensions {
}
[Fact]
public void Or() {
public void Or()
{
Expression<Func<testExpAddOr, bool>> where = a => a.id == Guid.Empty;
Assert.Equal("SELECT a.\"id\", a.\"num\" FROM \"testExpAddOr\" a WHERE ((a.\"id\" = '00000000-0000-0000-0000-000000000000' OR a.\"num\" > 0))", g.sqlite.Select<testExpAddOr>().Where(where.Or(b => b.num > 0)).ToSql().Replace("\r\n", ""));
@ -27,14 +31,16 @@ namespace FreeSql.Tests.Extensions {
}
[Fact]
public void Not() {
public void Not()
{
Expression<Func<testExpAddOr, bool>> where = a => a.id == Guid.Empty;
Assert.Equal("SELECT a.\"id\", a.\"num\" FROM \"testExpAddOr\" a WHERE (not(a.\"id\" = '00000000-0000-0000-0000-000000000000'))", g.sqlite.Select<testExpAddOr>().Where(where.Not()).ToSql().Replace("\r\n", ""));
Assert.Equal("SELECT a.\"id\", a.\"num\" FROM \"testExpAddOr\" a WHERE (a.\"id\" = '00000000-0000-0000-0000-000000000000')", g.sqlite.Select<testExpAddOr>().Where(where.Not(false)).ToSql().Replace("\r\n", ""));
}
class testExpAddOr {
class testExpAddOr
{
public Guid id { get; set; }
public int num { get; set; }

View File

@ -1,9 +1,12 @@
using Xunit;
namespace FreeSql.Tests.Extensions {
public class StringExtensionsTest {
namespace FreeSql.Tests.Extensions
{
public class StringExtensionsTest
{
[Fact]
public void FormatMySql() {
public void FormatMySql()
{
Assert.Empty(((string)null).FormatMySql("11"));
Assert.Equal("a=1", "a={0}".FormatMySql(1));
@ -23,7 +26,8 @@ namespace FreeSql.Tests.Extensions {
}
[Fact]
public void FormatSqlServer() {
public void FormatSqlServer()
{
Assert.Empty(((string)null).FormatSqlServer("11"));
Assert.Equal("a=1", "a={0}".FormatSqlServer(1));
@ -43,7 +47,8 @@ namespace FreeSql.Tests.Extensions {
}
[Fact]
public void FormatPostgreSQL() {
public void FormatPostgreSQL()
{
Assert.Empty(((string)null).FormatPostgreSQL("11"));
Assert.Equal("a=1", "a={0}".FormatPostgreSQL(1));

View File

@ -3,10 +3,12 @@ using System;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.LinqToSql {
namespace FreeSql.Tests.LinqToSql
{
class TestLinqToSql {
class TestLinqToSql
{
public Guid id { get; set; }
public string name { get; set; }
@ -15,7 +17,8 @@ namespace FreeSql.Tests.LinqToSql {
public DateTime createtime { get; set; } = DateTime.Now;
}
class TestLinqToSqlComment {
class TestLinqToSqlComment
{
public Guid id { get; set; }
public Guid TestLinqToSqlId { get; set; }
@ -26,10 +29,12 @@ namespace FreeSql.Tests.LinqToSql {
public DateTime createtime { get; set; } = DateTime.Now;
}
public class SqliteLinqToSqlTests {
public class SqliteLinqToSqlTests
{
[Fact]
public void Where() {
public void Where()
{
var item = new TestLinqToSql { name = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestLinqToSql>().AppendData(item).ExecuteAffrows();
@ -41,7 +46,8 @@ namespace FreeSql.Tests.LinqToSql {
}
[Fact]
public void Select() {
public void Select()
{
var item = new TestLinqToSql { name = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestLinqToSql>().AppendData(item).ExecuteAffrows();
@ -53,15 +59,18 @@ namespace FreeSql.Tests.LinqToSql {
}
[Fact]
public void GroupBy() {
public void GroupBy()
{
var item = new TestLinqToSql { name = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestLinqToSql>().AppendData(item).ExecuteAffrows();
var t1 = (from a in g.sqlite.Select<TestLinqToSql>()
where a.id == item.id
group a by new {a.id, a.name } into g
select new {
g.Key.id, g.Key.name,
group a by new { a.id, a.name } into g
select new
{
g.Key.id,
g.Key.name,
cou = g.Count(),
avg = g.Avg(g.Value.click),
sum = g.Sum(g.Value.click),
@ -73,16 +82,19 @@ namespace FreeSql.Tests.LinqToSql {
}
[Fact]
public void CaseWhen() {
public void CaseWhen()
{
var item = new TestLinqToSql { name = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestLinqToSql>().AppendData(item).ExecuteAffrows();
var t1 = (from a in g.sqlite.Select<TestLinqToSql>()
where a.id == item.id
select new {
select new
{
a.id,
a.name,
testsub = new {
testsub = new
{
time = a.click > 10 ? "´óÓÚ" : "СÓÚ»òµÈÓÚ"
}
}).ToList();
@ -92,7 +104,8 @@ namespace FreeSql.Tests.LinqToSql {
}
[Fact]
public void Join() {
public void Join()
{
var item = new TestLinqToSql { name = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestLinqToSql>().AppendData(item).ExecuteAffrows();
var comment = new TestLinqToSqlComment { TestLinqToSqlId = item.id, text = Guid.NewGuid().ToString() };
@ -121,7 +134,8 @@ namespace FreeSql.Tests.LinqToSql {
}
[Fact]
public void LeftJoin() {
public void LeftJoin()
{
var item = new TestLinqToSql { name = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestLinqToSql>().AppendData(item).ExecuteAffrows();
var comment = new TestLinqToSqlComment { TestLinqToSqlId = item.id, text = Guid.NewGuid().ToString() };
@ -153,7 +167,8 @@ namespace FreeSql.Tests.LinqToSql {
}
[Fact]
public void From() {
public void From()
{
var item = new TestLinqToSql { name = Guid.NewGuid().ToString() };
g.sqlite.Insert<TestLinqToSql>().AppendData(item).ExecuteAffrows();
var comment = new TestLinqToSqlComment { TestLinqToSqlId = item.id, text = Guid.NewGuid().ToString() };

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySql {
public class MySqlDeleteTest {
namespace FreeSql.Tests.MySql
{
public class MySqlDeleteTest
{
IDelete<Topic> delete => g.mysql.Delete<Topic>(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -20,7 +23,8 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void Dywhere() {
public void Dywhere()
{
Assert.Null(g.mysql.Delete<Topic>().ToSql());
var sql = g.mysql.Delete<Topic>(new[] { 1, 2 }).ToSql();
Assert.Equal("DELETE FROM `tb_topic` WHERE (`Id` = 1 OR `Id` = 2)", sql);
@ -36,7 +40,8 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void Where() {
public void Where()
{
var sql = delete.Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("DELETE FROM `tb_topic` WHERE (`Id` = 1)", sql);
@ -54,23 +59,27 @@ namespace FreeSql.Tests.MySql {
Assert.Equal("DELETE FROM `tb_topic` WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))", sql);
}
[Fact]
public void WhereExists() {
public void WhereExists()
{
}
[Fact]
public void ExecuteAffrows() {
public void ExecuteAffrows()
{
var id = g.mysql.Insert<Topic>(new Topic { Title = "xxxx" }).ExecuteIdentity();
Assert.Equal(1, delete.Where(a => a.Id == id).ExecuteAffrows());
}
[Fact]
public void ExecuteDeleted() {
public void ExecuteDeleted()
{
//delete.Where(a => a.Id > 0).ExecuteDeleted();
}
[Fact]
public void AsTable() {
public void AsTable()
{
Assert.Null(g.mysql.Delete<Topic>().ToSql());
var sql = g.mysql.Delete<Topic>(new[] { 1, 2 }).AsTable(a => "TopicAsTable").ToSql();
Assert.Equal("DELETE FROM `TopicAsTable` WHERE (`Id` = 1 OR `Id` = 2)", sql);

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySql {
public class MySqlInsertTest {
namespace FreeSql.Tests.MySql
{
public class MySqlInsertTest
{
IInsert<Topic> insert => g.mysql.Insert<Topic>(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -18,7 +21,8 @@ namespace FreeSql.Tests.MySql {
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
class TestEnumInsertTb {
class TestEnumInsertTb
{
[Column(IsIdentity = true)]
public int id { get; set; }
public TestEnumInserTbType type { get; set; }
@ -27,7 +31,8 @@ namespace FreeSql.Tests.MySql {
enum TestEnumInserTbType { str1, biggit, sum211 }
[Fact]
public void AppendData() {
public void AppendData()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
@ -51,18 +56,20 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void InsertColumns() {
public void InsertColumns()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
var sql = insert.AppendData(items).InsertColumns(a => a.Title).ToSql();
Assert.Equal("INSERT INTO `tb_topic`(`Title`) VALUES(?Title_0), (?Title_1), (?Title_2), (?Title_3), (?Title_4), (?Title_5), (?Title_6), (?Title_7), (?Title_8), (?Title_9)", sql);
sql = insert.AppendData(items).InsertColumns(a =>new { a.Title, a.Clicks }).ToSql();
sql = insert.AppendData(items).InsertColumns(a => new { a.Title, a.Clicks }).ToSql();
Assert.Equal("INSERT INTO `tb_topic`(`Clicks`, `Title`) VALUES(?Clicks_0, ?Title_0), (?Clicks_1, ?Title_1), (?Clicks_2, ?Title_2), (?Clicks_3, ?Title_3), (?Clicks_4, ?Title_4), (?Clicks_5, ?Title_5), (?Clicks_6, ?Title_6), (?Clicks_7, ?Title_7), (?Clicks_8, ?Title_8), (?Clicks_9, ?Title_9)", sql);
}
[Fact]
public void IgnoreColumns() {
public void IgnoreColumns()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
@ -73,7 +80,8 @@ namespace FreeSql.Tests.MySql {
Assert.Equal("INSERT INTO `tb_topic`(`Clicks`) VALUES(?Clicks_0), (?Clicks_1), (?Clicks_2), (?Clicks_3), (?Clicks_4), (?Clicks_5), (?Clicks_6), (?Clicks_7), (?Clicks_8), (?Clicks_9)", sql);
}
[Fact]
public void ExecuteAffrows() {
public void ExecuteAffrows()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
@ -84,19 +92,21 @@ namespace FreeSql.Tests.MySql {
Assert.Equal(1, g.mysql.Insert<TestEnumInsertTb>().AppendData(new TestEnumInsertTb { type = TestEnumInserTbType.sum211 }).NoneParameter().ExecuteAffrows());
}
[Fact]
public void ExecuteIdentity() {
public void ExecuteIdentity()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
Assert.NotEqual(0, insert.AppendData(items.First()).ExecuteIdentity());
var id = g.mysql.Insert<TestEnumInsertTb>().AppendData(new TestEnumInsertTb { type = TestEnumInserTbType.sum211 }).ExecuteIdentity();
Assert.Equal(TestEnumInserTbType.sum211, g.mysql.Select< TestEnumInsertTb>().Where(a => a.id == id).First()?.type);
Assert.Equal(TestEnumInserTbType.sum211, g.mysql.Select<TestEnumInsertTb>().Where(a => a.id == id).First()?.type);
id = g.mysql.Insert<TestEnumInsertTb>().AppendData(new TestEnumInsertTb { type = TestEnumInserTbType.sum211 }).NoneParameter().ExecuteIdentity();
Assert.Equal(TestEnumInserTbType.sum211, g.mysql.Select<TestEnumInsertTb>().Where(a => a.id == id).First()?.type);
}
[Fact]
public void ExecuteInserted() {
public void ExecuteInserted()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
@ -104,7 +114,8 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void AsTable() {
public void AsTable()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newTitle{a}", Clicks = a * 100 });

View File

@ -5,14 +5,17 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySql {
namespace FreeSql.Tests.MySql
{
public class MySqlSelectTest {
public class MySqlSelectTest
{
ISelect<Topic> select => g.mysql.Select<Topic>();
[Table(Name = "tb_topic")]
public class Topic {
public class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -24,12 +27,14 @@ namespace FreeSql.Tests.MySql {
public virtual TopicFields Fields { get; set; }
}
public class TopicFields {
public class TopicFields
{
[Column(IsPrimary = true)]
public int TopicId { get; set; }
public virtual Topic Topic { get; set; }
}
public class TestTypeInfo {
public class TestTypeInfo
{
[Column(IsIdentity = true)]
public int Guid { get; set; }
@ -40,7 +45,8 @@ namespace FreeSql.Tests.MySql {
public virtual ICollection<Topic> Topics { get; set; }
}
public class TestTypeParentInfo {
public class TestTypeParentInfo
{
[Column(IsIdentity = true)]
public int Id { get; set; }
public string Name { get; set; }
@ -48,7 +54,8 @@ namespace FreeSql.Tests.MySql {
public List<TestTypeInfo> Types { get; set; }
}
public partial class Song {
public partial class Song
{
[Column(IsIdentity = true)]
public int Id { get; set; }
public DateTime? Create_time { get; set; }
@ -58,14 +65,16 @@ namespace FreeSql.Tests.MySql {
public virtual ICollection<Tag> Tags { get; set; }
}
public partial class Song_tag {
public partial class Song_tag
{
public int Song_id { get; set; }
public virtual Song Song { get; set; }
public int Tag_id { get; set; }
public virtual Tag Tag { get; set; }
}
public partial class Tag {
public partial class Tag
{
[Column(IsIdentity = true)]
public int Id { get; set; }
public int? Parent_id { get; set; }
@ -80,7 +89,8 @@ namespace FreeSql.Tests.MySql {
[Fact]
public void AsSelect() {
public void AsSelect()
{
//OneToOne、ManyToOne
var t0 = g.mysql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
//SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
@ -113,7 +123,8 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void Lazy() {
public void Lazy()
{
var tags = g.mysql.Select<Tag>().Where(a => a.Parent.Name == "xxx")
.LeftJoin(a => a.Parent_id == a.Parent.Id)
.ToSql();
@ -122,7 +133,8 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void ToDataTable() {
public void ToDataTable()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
@ -137,13 +149,15 @@ namespace FreeSql.Tests.MySql {
var dt3 = select.Limit(10).ToDataTable(a => new { a.Id, a.Type.Name, now = DateTime.Now });
}
class TestDto {
class TestDto
{
public int id { get; set; }
public string name { get; set; } //这是join表的属性
public int ParentId { get; set; } //这是join表的属性
}
[Fact]
public void ToList() {
public void ToList()
{
var testDto1 = select.Limit(10).ToList(a => new TestDto { id = a.Id, name = a.Title });
var testDto2 = select.Limit(10).ToList(a => new TestDto());
@ -191,19 +205,23 @@ namespace FreeSql.Tests.MySql {
.LeftJoin(a => c.Id == b.ParentId)
.Where(a => b.Name != "xxx"));
var list111sql = list111.ToSql();
var list111data = list111.ToList((a, b, c) => new {
var list111data = list111.ToList((a, b, c) => new
{
a.Id,
title_substring = a.Title.Substring(0, 1),
a.Type,
ccc = new { a.Id, a.Title },
tp = a.Type,
tp2 = new {
tp2 = new
{
a.Id,
tp2 = a.Type.Name
},
tp3 = new {
tp3 = new
{
a.Id,
tp33 = new {
tp33 = new
{
a.Id
}
}
@ -211,19 +229,23 @@ namespace FreeSql.Tests.MySql {
var ttt122 = g.mysql.Select<TestTypeParentInfo>().Where(a => a.Id > 0).ToSql();
var sql5 = g.mysql.Select<TestInfo>().From<TestTypeInfo, TestTypeParentInfo>((s, b, c) => s).Where((a, b, c) => a.Id == b.ParentId).ToSql();
var t11112 = g.mysql.Select<TestInfo>().ToList(a => new {
var t11112 = g.mysql.Select<TestInfo>().ToList(a => new
{
a.Id,
a.Title,
a.Type,
ccc = new { a.Id, a.Title },
tp = a.Type,
tp2 = new {
tp2 = new
{
a.Id,
tp2 = a.Type.Name
},
tp3 = new {
tp3 = new
{
a.Id,
tp33 = new {
tp33 = new
{
a.Id
}
}
@ -245,17 +267,20 @@ namespace FreeSql.Tests.MySql {
var t11 = select.Where(a => a.Type.Name.Length > 0).ToList(true);
var t21 = select.Where(a => a.Type.Parent.Name.Length > 0).ToList(true);
}
class TestGuidIdToList {
class TestGuidIdToList
{
public Guid id { get; set; }
public string title { get; set; } = Guid.NewGuid().ToString();
}
[Fact]
public void ToOne() {
public void ToOne()
{
var testnotfind = select.Where("1=2").First(a => a.CreateTime);
Assert.Equal(default(DateTime), testnotfind);
}
[Fact]
public void ToSql() {
public void ToSql()
{
g.mysql.Insert<testenumWhere>().AppendData(new testenumWhere { type = testenumWhereType.Blaaa }).ExecuteAffrows();
var sql1 = g.mysql.Select<testenumWhere>().Where(a => a.type == testenumWhereType.Blaaa).ToSql();
@ -264,14 +289,16 @@ namespace FreeSql.Tests.MySql {
var sql3 = g.mysql.Select<testenumWhere>().Where(a => a.type.Equals(testenumWhereType.Blaaa)).ToSql();
var tolist = g.mysql.Select<testenumWhere>().Where(a => a.type == testenumWhereType.Blaaa).ToList();
}
class testenumWhere {
class testenumWhere
{
public Guid id { get; set; }
public testenumWhereType type { get; set; }
}
public enum testenumWhereType { Menu, Class, Blaaa }
[Fact]
public void Any() {
public void Any()
{
var count = select.Where(a => 1 == 1).Count();
Assert.False(select.Where(a => 1 == 2).Any());
Assert.Equal(count > 0, select.Where(a => 1 == 1).Any());
@ -293,18 +320,21 @@ namespace FreeSql.Tests.MySql {
collectionSelect.ToList();
}
[Fact]
public void Count() {
public void Count()
{
var count = select.Where(a => 1 == 1).Count();
select.Where(a => 1 == 1).Count(out var count2);
Assert.Equal(count, count2);
Assert.Equal(0, select.Where(a => 1 == 2).Count());
}
[Fact]
public void Master() {
public void Master()
{
Assert.StartsWith(" SELECT", select.Master().Where(a => 1 == 1).ToSql());
}
[Fact]
public void From() {
public void From()
{
var query2 = select.From<TestTypeInfo>((s, b) => s
.LeftJoin(a => a.TypeGuid == b.Guid)
);
@ -321,7 +351,8 @@ namespace FreeSql.Tests.MySql {
query3.ToList();
}
[Fact]
public void LeftJoin() {
public void LeftJoin()
{
//<2F><><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a.Type<70><65>a.Type.Parent <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
var query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid);
var sql = query.ToSql().Replace("\r\n", "");
@ -389,7 +420,8 @@ namespace FreeSql.Tests.MySql {
query.ToList();
}
[Fact]
public void InnerJoin() {
public void InnerJoin()
{
//<2F><><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a.Type<70><65>a.Type.Parent <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
var query = select.InnerJoin(a => a.Type.Guid == a.TypeGuid);
var sql = query.ToSql().Replace("\r\n", "");
@ -458,7 +490,8 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void RightJoin() {
public void RightJoin()
{
//<2F><><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a.Type<70><65>a.Type.Parent <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
var query = select.RightJoin(a => a.Type.Guid == a.TypeGuid);
var sql = query.ToSql().Replace("\r\n", "");
@ -527,7 +560,8 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void Where() {
public void Where()
{
var sqltmp1 = select.Where(a => a.Id == 0 && (a.Title == "x" || a.Title == "y") && a.Clicks == 1).ToSql();
var sqltmp2 = select.Where(a => a.Id.Equals(true) && (a.Title.Equals("x") || a.Title.Equals("y")) && a.Clicks.Equals(1)).ToSql();
@ -597,7 +631,8 @@ namespace FreeSql.Tests.MySql {
query.ToList();
}
[Fact]
public void WhereIf() {
public void WhereIf()
{
//<2F><><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a.Type<70><65>a.Type.Parent <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
var query = select.WhereIf(true, a => a.Id == 10);
var sql = query.ToSql().Replace("\r\n", "");
@ -691,7 +726,8 @@ namespace FreeSql.Tests.MySql {
query.ToList();
}
[Fact]
public void WhereExists() {
public void WhereExists()
{
var sql2222 = select.Where(a => select.Where(b => b.Id == a.Id).Any()).ToList();
sql2222 = select.Where(a =>
@ -704,7 +740,8 @@ namespace FreeSql.Tests.MySql {
).ToList();
}
[Fact]
public void GroupBy() {
public void GroupBy()
{
var groupby = select.From<TestTypeInfo, TestTypeParentInfo>((s, b, c) => s
.Where(a => a.Id == 1)
)
@ -715,7 +752,8 @@ namespace FreeSql.Tests.MySql {
.OrderByDescending(a => a.Count())
.Offset(10)
.Limit(2)
.ToList(a => new {
.ToList(a => new
{
a.Key.tt2,
cou1 = a.Count(),
arg1 = a.Avg(a.Key.mod4),
@ -729,7 +767,8 @@ namespace FreeSql.Tests.MySql {
var aggsql1 = select
.GroupBy(a => a.Title)
.ToSql(b => new {
.ToSql(b => new
{
b.Key,
cou = b.Count(),
sum = b.Sum(b.Key),
@ -737,7 +776,8 @@ namespace FreeSql.Tests.MySql {
});
var aggtolist1 = select
.GroupBy(a => a.Title)
.ToList(b => new {
.ToList(b => new
{
b.Key,
cou = b.Count(),
sum = b.Sum(b.Key),
@ -746,7 +786,8 @@ namespace FreeSql.Tests.MySql {
var aggsql2 = select
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
.ToSql(b => new {
.ToSql(b => new
{
b.Key.Title,
b.Key.yyyy,
@ -756,7 +797,8 @@ namespace FreeSql.Tests.MySql {
});
var aggtolist2 = select
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
.ToList(b => new {
.ToList(b => new
{
b.Key.Title,
b.Key.yyyy,
@ -767,7 +809,8 @@ namespace FreeSql.Tests.MySql {
var aggsql3 = select
.GroupBy(a => a.Title)
.ToSql(b => new {
.ToSql(b => new
{
b.Key,
cou = b.Count(),
sum = b.Sum(b.Key),
@ -776,24 +819,29 @@ namespace FreeSql.Tests.MySql {
});
}
[Fact]
public void ToAggregate() {
public void ToAggregate()
{
var sql = select.ToAggregate(a => new { sum = a.Sum(a.Key.Id + 11.11), avg = a.Avg(a.Key.Id), count = a.Count(), max = a.Max(a.Key.Id), min = a.Min(a.Key.Id) });
}
[Fact]
public void OrderBy() {
public void OrderBy()
{
var sql = select.OrderBy(a => new Random().NextDouble()).ToList();
}
[Fact]
public void Skip_Offset() {
public void Skip_Offset()
{
var sql = select.Offset(10).Limit(10).ToList();
}
[Fact]
public void Take_Limit() {
public void Take_Limit()
{
var sql = select.Limit(10).ToList();
}
[Fact]
public void Page() {
public void Page()
{
var sql1 = select.Page(1, 10).ToList();
var sql2 = select.Page(2, 10).ToList();
var sql3 = select.Page(3, 10).ToList();
@ -803,33 +851,41 @@ namespace FreeSql.Tests.MySql {
var sql33 = select.OrderBy(a => new Random().NextDouble()).Page(3, 10).ToList();
}
[Fact]
public void Distinct() {
public void Distinct()
{
var t1 = select.Distinct().ToList(a => a.Title);
var t2 = select.Distinct().Limit(10).ToList(a => a.Title);
}
[Fact]
public void Sum() {
public void Sum()
{
}
[Fact]
public void Min() {
public void Min()
{
}
[Fact]
public void Max() {
public void Max()
{
}
[Fact]
public void Avg() {
public void Avg()
{
}
[Fact]
public void As() {
public void As()
{
}
[Fact]
public void AsTable() {
public void AsTable()
{
var listt = select.AsTable((a, b) => "(select * from tb_topic where clicks > 10)").Page(1, 10).ToList();
Func<Type, string, string> tableRule = (type, oldname) => {
Func<Type, string, string> tableRule = (type, oldname) =>
{
if (type == typeof(Topic)) return oldname + "AsTable1";
else if (type == typeof(TestTypeInfo)) return oldname + "AsTable2";
return oldname + "AsTable";
@ -891,14 +947,16 @@ namespace FreeSql.Tests.MySql {
Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topicAsTable1` a LEFT JOIN TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = ?bname", sql);
}
public class TestInclude_OneToManyModel1 {
public class TestInclude_OneToManyModel1
{
[Column(IsIdentity = true)]
public int id { get; set; }
public virtual TestInclude_OneToManyModel2 model2 { get; set; }
public string m1name { get; set; }
}
public class TestInclude_OneToManyModel2 {
public class TestInclude_OneToManyModel2
{
[Column(IsPrimary = true)]
public int model2id { get; set; }
public virtual TestInclude_OneToManyModel1 model1 { get; set; }
@ -907,7 +965,8 @@ namespace FreeSql.Tests.MySql {
public List<TestInclude_OneToManyModel3> childs { get; set; }
}
public class TestInclude_OneToManyModel3 {
public class TestInclude_OneToManyModel3
{
[Column(IsIdentity = true)]
public int id { get; set; }
@ -916,7 +975,8 @@ namespace FreeSql.Tests.MySql {
public List<TestInclude_OneToManyModel4> childs2 { get; set; }
}
public class TestInclude_OneToManyModel4 {
public class TestInclude_OneToManyModel4
{
[Column(IsIdentity = true)]
public int id { get; set; }
@ -925,7 +985,8 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void Include_OneToMany() {
public void Include_OneToMany()
{
var model1 = new TestInclude_OneToManyModel1 { m1name = DateTime.Now.Second.ToString() };
model1.id = (int)g.mysql.Insert(model1).ExecuteIdentity();
var model2 = new TestInclude_OneToManyModel2 { model2id = model1.id, m2setting = DateTime.Now.Second.ToString() };
@ -980,7 +1041,8 @@ namespace FreeSql.Tests.MySql {
.ToList();
}
public class TestInclude_OneToManyModel11 {
public class TestInclude_OneToManyModel11
{
[Column(IsIdentity = true)]
public int id { get; set; }
public int model2id { get; set; }
@ -989,13 +1051,15 @@ namespace FreeSql.Tests.MySql {
public string m1name { get; set; }
}
public class TestInclude_OneToManyModel22 {
public class TestInclude_OneToManyModel22
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string m2setting { get; set; }
public List<TestInclude_OneToManyModel33> childs { get; set; }
}
public class TestInclude_OneToManyModel33 {
public class TestInclude_OneToManyModel33
{
[Column(IsIdentity = true)]
public int id { get; set; }
public int model2Id { get; set; }
@ -1003,7 +1067,8 @@ namespace FreeSql.Tests.MySql {
public string setting { get; set; }
}
[Fact]
public void Include_OneToMany2() {
public void Include_OneToMany2()
{
string setting = "x";
var model2 = new TestInclude_OneToManyModel22 { m2setting = DateTime.Now.Second.ToString() };
model2.id = (int)g.mysql.Insert(model2).ExecuteIdentity();
@ -1033,37 +1098,44 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void Include_OneToChilds() {
var tag1 = new Tag {
public void Include_OneToChilds()
{
var tag1 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_01_中国"
};
tag1.Id = (int)g.mysql.Insert(tag1).ExecuteIdentity();
var tag1_1 = new Tag {
var tag1_1 = new Tag
{
Parent_id = tag1.Id,
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_01_北京"
};
tag1_1.Id = (int)g.mysql.Insert(tag1_1).ExecuteIdentity();
var tag1_2 = new Tag {
var tag1_2 = new Tag
{
Parent_id = tag1.Id,
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_01_上海"
};
tag1_2.Id = (int)g.mysql.Insert(tag1_2).ExecuteIdentity();
var tag2 = new Tag {
var tag2 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_02_美国"
};
tag2.Id = (int)g.mysql.Insert(tag2).ExecuteIdentity();
var tag2_1 = new Tag {
var tag2_1 = new Tag
{
Parent_id = tag2.Id,
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_02_纽约"
};
tag2_1.Id = (int)g.mysql.Insert(tag2_1).ExecuteIdentity();
var tag2_2 = new Tag {
var tag2_2 = new Tag
{
Parent_id = tag2.Id,
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_02_华盛顿"
@ -1123,37 +1195,44 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void Include_ManyToMany() {
public void Include_ManyToMany()
{
var tag1 = new Tag {
var tag1 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_manytoMany_01_中国"
};
tag1.Id = (int)g.mysql.Insert(tag1).ExecuteIdentity();
var tag2 = new Tag {
var tag2 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_manytoMany_02_美国"
};
tag2.Id = (int)g.mysql.Insert(tag2).ExecuteIdentity();
var tag3 = new Tag {
var tag3 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_manytoMany_03_日本"
};
tag3.Id = (int)g.mysql.Insert(tag3).ExecuteIdentity();
var song1 = new Song {
var song1 = new Song
{
Create_time = DateTime.Now,
Title = "test_manytoMany_01_我是中国人.mp3",
Url = "http://ww.baidu.com/"
};
song1.Id = (int)g.mysql.Insert(song1).ExecuteIdentity();
var song2 = new Song {
var song2 = new Song
{
Create_time = DateTime.Now,
Title = "test_manytoMany_02_爱你一万年.mp3",
Url = "http://ww.163.com/"
};
song2.Id = (int)g.mysql.Insert(song2).ExecuteIdentity();
var song3 = new Song {
var song3 = new Song
{
Create_time = DateTime.Now,
Title = "test_manytoMany_03_千年等一回.mp3",
Url = "http://ww.sina.com/"

View File

@ -3,12 +3,15 @@ using System;
using System.Collections.Generic;
using Xunit;
namespace FreeSql.Tests.MySql {
public class MySqlUpdateTest {
namespace FreeSql.Tests.MySql
{
public class MySqlUpdateTest
{
IUpdate<Topic> update => g.mysql.Update<Topic>();
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int? Clicks { get; set; }
@ -16,7 +19,8 @@ namespace FreeSql.Tests.MySql {
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
class TestEnumUpdateTb {
class TestEnumUpdateTb
{
[Column(IsIdentity = true)]
public int id { get; set; }
public TestEnumUpdateTbType type { get; set; }
@ -25,7 +29,8 @@ namespace FreeSql.Tests.MySql {
enum TestEnumUpdateTbType { str1, biggit, sum211 }
[Fact]
public void Dywhere() {
public void Dywhere()
{
Assert.Null(g.mysql.Update<Topic>().ToSql());
Assert.Equal("UPDATE `tb_topic` SET title='test' \r\nWHERE (`Id` = 1 OR `Id` = 2)", g.mysql.Update<Topic>(new[] { 1, 2 }).SetRaw("title='test'").ToSql());
Assert.Equal("UPDATE `tb_topic` SET title='test1' \r\nWHERE (`Id` = 1)", g.mysql.Update<Topic>(new Topic { Id = 1, Title = "test" }).SetRaw("title='test1'").ToSql());
@ -34,7 +39,8 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void SetSource() {
public void SetSource()
{
var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET `Clicks` = ?p_0, `Title` = ?p_1, `CreateTime` = ?p_2 WHERE (`Id` = 1)", sql);
@ -47,7 +53,7 @@ namespace FreeSql.Tests.MySql {
sql = update.SetSource(items).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET `Title` = CASE `Id` WHEN 1 THEN ?p_0 WHEN 2 THEN ?p_1 WHEN 3 THEN ?p_2 WHEN 4 THEN ?p_3 WHEN 5 THEN ?p_4 WHEN 6 THEN ?p_5 WHEN 7 THEN ?p_6 WHEN 8 THEN ?p_7 WHEN 9 THEN ?p_8 WHEN 10 THEN ?p_9 END WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))", sql);
sql = update.SetSource(items).Set(a => a.CreateTime, new DateTime(2020,1,1)).ToSql().Replace("\r\n", "");
sql = update.SetSource(items).Set(a => a.CreateTime, new DateTime(2020, 1, 1)).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET `CreateTime` = ?p_0 WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))", sql);
sql = g.mysql.Insert<TestEnumUpdateTb>().AppendData(new TestEnumUpdateTb { type = TestEnumUpdateTbType.sum211 }).ToSql().Replace("\r\n", "");
@ -73,7 +79,8 @@ namespace FreeSql.Tests.MySql {
Assert.Equal(TestEnumUpdateTbType.biggit, g.mysql.Select<TestEnumUpdateTb>().Where(a => a.id == id).First()?.type);
}
[Fact]
public void IgnoreColumns() {
public void IgnoreColumns()
{
var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET `Title` = ?p_0 WHERE (`Id` = 1)", sql);
@ -84,7 +91,8 @@ namespace FreeSql.Tests.MySql {
Assert.Equal("UPDATE `TestEnumUpdateTb` SET `type` = 'sum211' WHERE (`id` = 0)", sql);
}
[Fact]
public void UpdateColumns() {
public void UpdateColumns()
{
var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).UpdateColumns(a => a.Title).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET `Title` = ?p_0 WHERE (`Id` = 1)", sql);
@ -95,7 +103,8 @@ namespace FreeSql.Tests.MySql {
Assert.Equal("UPDATE `TestEnumUpdateTb` SET `type` = 'sum211' WHERE (`id` = 0)", sql);
}
[Fact]
public void Set() {
public void Set()
{
var sql = update.Where(a => a.Id == 1).Set(a => a.Title, "newtitle").ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET `Title` = ?p_0 WHERE (`Id` = 1)", sql);
@ -134,7 +143,8 @@ namespace FreeSql.Tests.MySql {
Assert.Equal(TestEnumUpdateTbType.str1, g.mysql.Select<TestEnumUpdateTb>().Where(a => a.id == id).First()?.type);
}
[Fact]
public void SetRaw() {
public void SetRaw()
{
var sql = update.Where(a => a.Id == 1).SetRaw("clicks = clicks + ?incrClick", new { incrClick = 1 }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET clicks = clicks + ?incrClick WHERE (`Id` = 1)", sql);
@ -142,7 +152,8 @@ namespace FreeSql.Tests.MySql {
Assert.Equal("UPDATE `TestEnumUpdateTb` SET `type` = 'sum211' WHERE (`id` = 0)", sql);
}
[Fact]
public void Where() {
public void Where()
{
var sql = update.Where(a => a.Id == 1).SetRaw("title='newtitle'").ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET title='newtitle' WHERE (`Id` = 1)", sql);
@ -163,20 +174,24 @@ namespace FreeSql.Tests.MySql {
Assert.Equal("UPDATE `TestEnumUpdateTb` SET `type` = 'sum211' WHERE (`id` = 0 AND `type` = 'str1')", sql);
}
[Fact]
public void WhereExists() {
public void WhereExists()
{
}
[Fact]
public void ExecuteAffrows() {
public void ExecuteAffrows()
{
}
[Fact]
public void ExecuteUpdated() {
public void ExecuteUpdated()
{
}
[Fact]
public void AsTable() {
public void AsTable()
{
Assert.Null(g.mysql.Update<Topic>().ToSql());
Assert.Equal("UPDATE `tb_topicAsTable` SET title='test' \r\nWHERE (`Id` = 1 OR `Id` = 2)", g.mysql.Update<Topic>(new[] { 1, 2 }).SetRaw("title='test'").AsTable(a => "tb_topicAsTable").ToSql());
Assert.Equal("UPDATE `tb_topicAsTable` SET title='test1' \r\nWHERE (`Id` = 1)", g.mysql.Update<Topic>(new Topic { Id = 1, Title = "test" }).SetRaw("title='test1'").AsTable(a => "tb_topicAsTable").ToSql());

View File

@ -2,9 +2,12 @@ using FreeSql.DataAnnotations;
using System;
using Xunit;
namespace FreeSql.Tests.MySqlMapType {
public class BoolNullableTest {
class BoolNullableMap {
namespace FreeSql.Tests.MySqlMapType
{
public class BoolNullableTest
{
class BoolNullableMap
{
public Guid id { get; set; }
[Column(MapType = typeof(bool))]
public bool? tobool { get; set; } = true;
@ -57,7 +60,8 @@ namespace FreeSql.Tests.MySqlMapType {
public bool? tostring { get; set; } = true;
}
[Fact]
public void Bool() {
public void Bool()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -138,7 +142,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void SByte() {
public void SByte()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -219,7 +224,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void SByteNullable() {
public void SByteNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -300,7 +306,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Short() {
public void Short()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -381,7 +388,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ShortNullable() {
public void ShortNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -462,7 +470,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Int() {
public void Int()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -543,7 +552,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void IntNullable() {
public void IntNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -624,7 +634,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Long() {
public void Long()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -705,7 +716,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void LongNullable() {
public void LongNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -787,7 +799,8 @@ namespace FreeSql.Tests.MySqlMapType {
}
[Fact]
public void Byte() {
public void Byte()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -868,7 +881,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ByteNullable() {
public void ByteNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -949,7 +963,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UShort() {
public void UShort()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -1030,7 +1045,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UShortNullable() {
public void UShortNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -1111,7 +1127,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UInt() {
public void UInt()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -1192,7 +1209,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UIntNullable() {
public void UIntNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -1273,7 +1291,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ULong() {
public void ULong()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -1354,7 +1373,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ULongNullable() {
public void ULongNullable()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -1436,23 +1456,29 @@ namespace FreeSql.Tests.MySqlMapType {
}
[Fact]
public void TimeSpan() {
public void TimeSpan()
{
}
[Fact]
public void TimeSpanNullable() {
public void TimeSpanNullable()
{
}
[Fact]
public void DateTime() {
public void DateTime()
{
}
[Fact]
public void DateTimeNullable() {
public void DateTimeNullable()
{
}
[Fact]
public void ByteArray() {
public void ByteArray()
{
}
[Fact]
public void String() {
public void String()
{
//insert
var orm = g.mysql;
var item = new BoolNullableMap { };
@ -1534,29 +1560,37 @@ namespace FreeSql.Tests.MySqlMapType {
}
[Fact]
public void Guid() {
public void Guid()
{
}
[Fact]
public void GuidNullable() {
public void GuidNullable()
{
}
[Fact]
public void MygisPoint() {
public void MygisPoint()
{
}
[Fact]
public void MygisLineString() {
public void MygisLineString()
{
}
[Fact]
public void MygisPolygon() {
public void MygisPolygon()
{
}
[Fact]
public void MygisMultiPoint() {
public void MygisMultiPoint()
{
}
[Fact]
public void MygisMultiLineString() {
public void MygisMultiLineString()
{
}
[Fact]
public void MygisMultiPolygon() {
public void MygisMultiPolygon()
{
}
}
}

View File

@ -2,10 +2,13 @@ using FreeSql.DataAnnotations;
using System;
using Xunit;
namespace FreeSql.Tests.MySqlMapType {
public class BoolTest {
namespace FreeSql.Tests.MySqlMapType
{
public class BoolTest
{
class BoolMap {
class BoolMap
{
public Guid id { get; set; }
[Column(MapType = typeof(bool?))]
public bool toboolnullable { get; set; } = true;
@ -59,7 +62,8 @@ namespace FreeSql.Tests.MySqlMapType {
}
[Fact]
public void BoolNullable() {
public void BoolNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -114,7 +118,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void SByte() {
public void SByte()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -169,7 +174,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void SByteNullable() {
public void SByteNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -224,7 +230,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Short() {
public void Short()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -279,7 +286,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ShortNullable() {
public void ShortNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -334,7 +342,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Int() {
public void Int()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -389,7 +398,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void IntNullable() {
public void IntNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -444,7 +454,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Long() {
public void Long()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -499,7 +510,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void LongNullable() {
public void LongNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -555,7 +567,8 @@ namespace FreeSql.Tests.MySqlMapType {
}
[Fact]
public void Byte() {
public void Byte()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -610,7 +623,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ByteNullable() {
public void ByteNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -665,7 +679,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UShort() {
public void UShort()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -720,7 +735,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UShortNullable() {
public void UShortNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -775,7 +791,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UInt() {
public void UInt()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -830,7 +847,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UIntNullable() {
public void UIntNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -885,7 +903,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ULong() {
public void ULong()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -940,7 +959,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ULongNullable() {
public void ULongNullable()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -996,23 +1016,29 @@ namespace FreeSql.Tests.MySqlMapType {
}
[Fact]
public void TimeSpan() {
public void TimeSpan()
{
}
[Fact]
public void TimeSpanNullable() {
public void TimeSpanNullable()
{
}
[Fact]
public void DateTime() {
public void DateTime()
{
}
[Fact]
public void DateTimeNullable() {
public void DateTimeNullable()
{
}
[Fact]
public void ByteArray() {
public void ByteArray()
{
}
[Fact]
public void String() {
public void String()
{
//insert
var orm = g.mysql;
var item = new BoolMap { };
@ -1068,29 +1094,37 @@ namespace FreeSql.Tests.MySqlMapType {
}
[Fact]
public void Guid() {
public void Guid()
{
}
[Fact]
public void GuidNullable() {
public void GuidNullable()
{
}
[Fact]
public void MygisPoint() {
public void MygisPoint()
{
}
[Fact]
public void MygisLineString() {
public void MygisLineString()
{
}
[Fact]
public void MygisPolygon() {
public void MygisPolygon()
{
}
[Fact]
public void MygisMultiPoint() {
public void MygisMultiPoint()
{
}
[Fact]
public void MygisMultiLineString() {
public void MygisMultiLineString()
{
}
[Fact]
public void MygisMultiPolygon() {
public void MygisMultiPolygon()
{
}
}
}

View File

@ -3,9 +3,12 @@ using System;
using System.Numerics;
using Xunit;
namespace FreeSql.Tests.MySqlMapType {
public class EnumTest {
class EnumTestMap {
namespace FreeSql.Tests.MySqlMapType
{
public class EnumTest
{
class EnumTestMap
{
public Guid id { get; set; }
[Column(MapType = typeof(string))]
@ -20,7 +23,8 @@ namespace FreeSql.Tests.MySqlMapType {
}
public enum ToStringMapEnum { ÖйúÈË, abc, Ïã¸Û }
[Fact]
public void EnumToString() {
public void EnumToString()
{
//insert
var orm = g.mysql;
var item = new EnumTestMap { };
@ -76,7 +80,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<EnumTestMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void EnumNullableToString() {
public void EnumNullableToString()
{
//insert
var orm = g.mysql;
var item = new EnumTestMap { };
@ -136,7 +141,8 @@ namespace FreeSql.Tests.MySqlMapType {
}
[Fact]
public void EnumToInt() {
public void EnumToInt()
{
//insert
var orm = g.mysql;
var item = new EnumTestMap { };
@ -192,7 +198,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<EnumTestMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void EnumNullableToInt() {
public void EnumNullableToInt()
{
//insert
var orm = g.mysql;
var item = new EnumTestMap { };

View File

@ -3,9 +3,12 @@ using System;
using System.Numerics;
using Xunit;
namespace FreeSql.Tests.MySqlMapType {
public class ToStringTest {
class ToStringMap {
namespace FreeSql.Tests.MySqlMapType
{
public class ToStringTest
{
class ToStringMap
{
public Guid id { get; set; }
[Column(MapType = typeof(string))]
@ -35,7 +38,8 @@ namespace FreeSql.Tests.MySqlMapType {
}
public enum ToStringMapEnum { ÖйúÈË, abc, Ïã¸Û }
[Fact]
public void Enum1() {
public void Enum1()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -91,7 +95,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void EnumNullable() {
public void EnumNullable()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -150,7 +155,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void BigInteger1() {
public void BigInteger1()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -206,7 +212,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void BigIntegerNullable() {
public void BigIntegerNullable()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -265,7 +272,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void TimeSpan1() {
public void TimeSpan1()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -305,7 +313,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void TimeSpanNullable() {
public void TimeSpanNullable()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -359,7 +368,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void DateTime1() {
public void DateTime1()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -399,7 +409,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void DateTimeNullable() {
public void DateTimeNullable()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -454,7 +465,8 @@ namespace FreeSql.Tests.MySqlMapType {
}
[Fact]
public void Guid1() {
public void Guid1()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };
@ -497,7 +509,8 @@ namespace FreeSql.Tests.MySqlMapType {
Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void GuidNullable() {
public void GuidNullable()
{
//insert
var orm = g.mysql;
var item = new ToStringMap { };

View File

@ -2,37 +2,46 @@ using FreeSql.DataAnnotations;
using System;
using Xunit;
namespace FreeSql.Tests.MySql {
public class MySqlAdoTest {
namespace FreeSql.Tests.MySql
{
public class MySqlAdoTest
{
[Fact]
public void Pool() {
public void Pool()
{
var t1 = g.mysql.Ado.MasterPool.StatisticsFullily;
}
[Fact]
public void SlavePools() {
public void SlavePools()
{
var t2 = g.mysql.Ado.SlavePools.Count;
}
[Fact]
public void ExecuteReader() {
public void ExecuteReader()
{
}
[Fact]
public void ExecuteArray() {
public void ExecuteArray()
{
}
[Fact]
public void ExecuteNonQuery() {
public void ExecuteNonQuery()
{
}
[Fact]
public void ExecuteScalar() {
public void ExecuteScalar()
{
}
[Fact]
public void Query() {
public void Query()
{
var t3 = g.mysql.Ado.Query<xxx>("select * from song");
var t4 = g.mysql.Ado.Query<(int, string, string)>("select * from song");
@ -41,11 +50,13 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void QueryMultipline() {
public void QueryMultipline()
{
var t3 = g.mysql.Ado.Query<xxx, (int, string, string), dynamic>("select * from song; select * from song; select * from song");
}
class xxx {
class xxx
{
public int Id { get; set; }
public string Path { get; set; }
public string Title2 { get; set; }

View File

@ -6,15 +6,19 @@ using System.Linq;
using System.Text;
using Xunit;
namespace FreeSql.Tests.MySql {
public class MySqlCodeFirstTest {
namespace FreeSql.Tests.MySql
{
public class MySqlCodeFirstTest
{
[Fact]
public void _字段() {
public void _字段()
{
var sql = g.mysql.CodeFirst.GetComparisonDDLStatements<2>();
g.mysql.CodeFirst.SyncStructure<2>();
var item = new 2 {
var item = new 2
{
= "测试标题",
= DateTime.Now
};
@ -25,7 +29,8 @@ namespace FreeSql.Tests.MySql {
Assert.Equal(item., item2.);
Assert.Equal(item., item2.);
}
class 2 {
class 2
{
[Column(IsPrimary = true)]
public Guid { get; set; }
@ -35,12 +40,14 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void AddUniques() {
public void AddUniques()
{
var sql = g.mysql.CodeFirst.GetComparisonDDLStatements<AddUniquesInfo>();
g.mysql.CodeFirst.SyncStructure<AddUniquesInfo>();
}
[Table(Name = "AddUniquesInfo", OldName = "AddUniquesInfo2")]
class AddUniquesInfo {
class AddUniquesInfo
{
public Guid id { get; set; }
[Column(Unique = "uk_phone")]
public string phone { get; set; }
@ -54,14 +61,16 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void AddField() {
public void AddField()
{
var sql = g.mysql.CodeFirst.GetComparisonDDLStatements<TopicAddField>();
var id = g.mysql.Insert<TopicAddField>().AppendData(new TopicAddField { }).ExecuteIdentity();
}
[Table(Name = "TopicAddField", OldName = "xxxtb.TopicAddField")]
public class TopicAddField {
public class TopicAddField
{
[Column(IsIdentity = true)]
public int? Id { get; set; }
@ -75,10 +84,12 @@ namespace FreeSql.Tests.MySql {
}
[Fact]
public void GetComparisonDDLStatements() {
public void GetComparisonDDLStatements()
{
var sql = g.mysql.CodeFirst.GetComparisonDDLStatements<TableAllType>();
if (string.IsNullOrEmpty(sql) == false) {
if (string.IsNullOrEmpty(sql) == false)
{
Assert.Equal(@"CREATE TABLE IF NOT EXISTS `cccddd`.`tb_alltype` (
`Id` INT(11) NOT NULL AUTO_INCREMENT,
`testFieldBool` BIT(1) NOT NULL,
@ -135,13 +146,15 @@ namespace FreeSql.Tests.MySql {
ISelect<TableAllType> select => g.mysql.Select<TableAllType>();
[Fact]
public void CurdAllField() {
public void CurdAllField()
{
var item = new TableAllType { };
item.Id = (int)insert.AppendData(item).ExecuteIdentity();
var newitem = select.Where(a => a.Id == item.Id).ToOne();
var item2 = new TableAllType {
var item2 = new TableAllType
{
testFieldBool = true,
testFieldBoolNullable = true,
testFieldByte = 255,
@ -209,7 +222,8 @@ namespace FreeSql.Tests.MySql {
[JsonObject(MemberSerialization.OptIn), Table(Name = "tb_alltype")]
public partial class Tb_alltype {
public partial class Tb_alltype
{
[JsonProperty, Column(Name = "Id", DbType = "int(11)", IsPrimary = true, IsIdentity = true)]
public int Id { get; set; }
@ -385,7 +399,8 @@ namespace FreeSql.Tests.MySql {
internal static IFreeSql mysql => null;
public static FreeSql.ISelect<Tb_alltype> Select => mysql.Select<Tb_alltype>();
public static long Delete(int Id) {
public static long Delete(int Id)
{
var affrows = mysql.Delete<Tb_alltype>().Where(a => a.Id == Id).ExecuteAffrows();
return affrows;
}
@ -393,8 +408,10 @@ namespace FreeSql.Tests.MySql {
/// <summary>
/// 保存或添加,如果主键有值则尝试 Update如果影响的行为 0 则尝试 Insert
/// </summary>
public void Save() {
if (this.Id != default(int)) {
public void Save()
{
if (this.Id != default(int))
{
var affrows = mysql.Update<Tb_alltype>().Where(a => a.Id == Id).ExecuteAffrows();
if (affrows > 0) return;
}
@ -403,24 +420,29 @@ namespace FreeSql.Tests.MySql {
}
public enum Tb_alltypeTESTFIELDENUM1 {
public enum Tb_alltypeTESTFIELDENUM1
{
E1 = 1, E2, E3, E5
}
public enum Tb_alltypeTESTFIELDENUM1NULLABLE {
public enum Tb_alltypeTESTFIELDENUM1NULLABLE
{
E1 = 1, E2, E3, E5
}
[Flags]
public enum Tb_alltypeTESTFIELDENUM2 : long {
public enum Tb_alltypeTESTFIELDENUM2 : long
{
F1 = 1, F2 = 2, F3 = 4
}
[Flags]
public enum Tb_alltypeTESTFIELDENUM2NULLABLE : long {
public enum Tb_alltypeTESTFIELDENUM2NULLABLE : long
{
F1 = 1, F2 = 2, F3 = 4
}
[Table(Name = "tb_alltype")]
class TableAllType {
class TableAllType
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }

View File

@ -2,17 +2,21 @@ using FreeSql.DataAnnotations;
using System;
using Xunit;
namespace FreeSql.Tests.MySql {
public class MySqlDbFirstTest {
namespace FreeSql.Tests.MySql
{
public class MySqlDbFirstTest
{
[Fact]
public void GetDatabases() {
public void GetDatabases()
{
var t1 = g.mysql.DbFirst.GetDatabases();
}
[Fact]
public void GetTablesByDatabase() {
public void GetTablesByDatabase()
{
var t2 = g.mysql.DbFirst.GetTablesByDatabase(g.mysql.DbFirst.GetDatabases()[0]);

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlExpression {
public class ConvertTest {
namespace FreeSql.Tests.MySqlExpression
{
public class ConvertTest
{
ISelect<Topic> select => g.mysql.Select<Topic>();
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -19,13 +22,15 @@ namespace FreeSql.Tests.MySqlExpression {
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
class TestTypeInfo {
class TestTypeInfo
{
public int Guid { get; set; }
public int ParentId { get; set; }
public TestTypeParentInfo Parent { get; set; }
public string Name { get; set; }
}
class TestTypeParentInfo {
class TestTypeParentInfo
{
public int Id { get; set; }
public string Name { get; set; }
@ -33,111 +38,129 @@ namespace FreeSql.Tests.MySqlExpression {
}
[Fact]
public void ToBoolean() {
public void ToBoolean()
{
var data = new List<object>();
data.Add(select.Where(a => (Convert.ToBoolean(a.Clicks) ? 1 : 0) > 0).ToList());
data.Add(select.Where(a => (bool.Parse(a.Clicks.ToString()) ? 1 : 0) > 0).ToList());
}
[Fact]
public void ToByte() {
public void ToByte()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToByte(a.Clicks % 255) > 0).ToList());
data.Add(select.Where(a => byte.Parse((a.Clicks % 255).ToString()) > 0).ToList());
}
[Fact]
public void ToChar() {
public void ToChar()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToChar(a.Clicks) == '1').ToList());
data.Add(select.Where(a => char.Parse(a.Clicks.ToString()) == '1').ToList());
}
[Fact]
public void ToDateTime() {
public void ToDateTime()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToDateTime(a.CreateTime.ToString()).Year > 0).ToList());
data.Add(select.Where(a => DateTime.Parse(a.CreateTime.ToString()).Year > 0).ToList());
}
[Fact]
public void ToDecimal() {
public void ToDecimal()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToDecimal(a.Clicks) > 0).ToList());
data.Add(select.Where(a => decimal.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void ToDouble() {
public void ToDouble()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToDouble(a.Clicks) > 0).ToList());
data.Add(select.Where(a => double.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void ToInt16() {
public void ToInt16()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToInt16(a.Clicks) > 0).ToList());
data.Add(select.Where(a => short.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void ToInt32() {
public void ToInt32()
{
var data = new List<object>();
data.Add(select.Where(a => (int)a.Clicks > 0).ToList());
data.Add(select.Where(a => Convert.ToInt32(a.Clicks) > 0).ToList());
data.Add(select.Where(a => int.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void ToInt64() {
public void ToInt64()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToInt64(a.Clicks) > 0).ToList());
data.Add(select.Where(a => long.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void ToSByte() {
public void ToSByte()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToSByte(a.Clicks % 128) > 0).ToList());
data.Add(select.Where(a => sbyte.Parse((a.Clicks % 128).ToString()) > 0).ToList());
}
[Fact]
public void ToSingle() {
public void ToSingle()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToSingle(a.Clicks) > 0).ToList());
data.Add(select.Where(a => float.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void this_ToString() {
public void this_ToString()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToString(a.Clicks).Equals("")).ToList());
data.Add(select.Where(a => a.Clicks.ToString().Equals("")).ToList());
}
[Fact]
public void ToUInt16() {
public void ToUInt16()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToUInt16(a.Clicks) > 0).ToList());
data.Add(select.Where(a => ushort.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void ToUInt32() {
public void ToUInt32()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToUInt32(a.Clicks) > 0).ToList());
data.Add(select.Where(a => uint.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void ToUInt64() {
public void ToUInt64()
{
var data = new List<object>();
data.Add(select.Where(a => Convert.ToUInt64(a.Clicks) > 0).ToList());
data.Add(select.Where(a => ulong.Parse(a.Clicks.ToString()) > 0).ToList());
}
[Fact]
public void Guid_Parse() {
public void Guid_Parse()
{
var data = new List<object>();
data.Add(select.Where(a => Guid.Parse(Guid.Empty.ToString()) == Guid.Empty).ToList());
}
[Fact]
public void Guid_NewGuid() {
public void Guid_NewGuid()
{
var data = new List<object>();
//data.Add(select.OrderBy(a => Guid.NewGuid()).Limit(10).ToList());
}
[Fact]
public void Random() {
public void Random()
{
var data = new List<object>();
data.Add(select.Where(a => new Random().Next() > a.Clicks).Limit(10).ToList());
data.Add(select.Where(a => new Random().NextDouble() > a.Clicks).Limit(10).ToList());

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlExpression {
public class DateTimeTest {
namespace FreeSql.Tests.MySqlExpression
{
public class DateTimeTest
{
ISelect<Topic> select => g.mysql.Select<Topic>();
[Table(Name = "tb_topic111333")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -20,7 +23,8 @@ namespace FreeSql.Tests.MySqlExpression {
public DateTime CreateTime { get; set; }
}
[Table(Name = "TestTypeInfo333")]
class TestTypeInfo {
class TestTypeInfo
{
[Column(IsIdentity = true)]
public int Guid { get; set; }
public int ParentId { get; set; }
@ -29,7 +33,8 @@ namespace FreeSql.Tests.MySqlExpression {
public DateTime Time { get; set; }
}
[Table(Name = "TestTypeParentInfo23123")]
class TestTypeParentInfo {
class TestTypeParentInfo
{
public int Id { get; set; }
public string Name { get; set; }
@ -37,7 +42,8 @@ namespace FreeSql.Tests.MySqlExpression {
public DateTime Time2 { get; set; }
}
[Fact]
public void Now() {
public void Now()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Date == DateTime.Now.Date).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -45,7 +51,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (cast(date_format(a.`CreateTime`, '%Y-%m-%d') as datetime) = cast(date_format(now(), '%Y-%m-%d') as datetime))
}
[Fact]
public void UtcNow() {
public void UtcNow()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Date == DateTime.UtcNow.Date).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -53,7 +60,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (cast(date_format(a.`CreateTime`, '%Y-%m-%d') as datetime) = cast(date_format(utc_timestamp(), '%Y-%m-%d') as datetime))
}
[Fact]
public void MinValue() {
public void MinValue()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Date == DateTime.MinValue.Date).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -61,7 +69,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (cast(date_format(a.`CreateTime`, '%Y-%m-%d') as datetime) = cast(date_format(cast('0001/1/1 0:00:00' as datetime), '%Y-%m-%d') as datetime))
}
[Fact]
public void MaxValue() {
public void MaxValue()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Date == DateTime.MaxValue.Date).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -69,7 +78,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (cast(date_format(a.`CreateTime`, '%Y-%m-%d') as datetime) = cast(date_format(cast('9999/12/31 23:59:59' as datetime), '%Y-%m-%d') as datetime))
}
[Fact]
public void Date() {
public void Date()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Date == DateTime.Now.Date).ToList());
data.Add(select.Where(a => a.Type.Time.Date > DateTime.Now.Date).ToList());
@ -101,7 +111,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((timestampdiff(microsecond, cast(date_format(a__Type__Parent.`Time2`, '%Y-%m-%d') as datetime), now())) / 1000000) > 0)
}
[Fact]
public void TimeOfDay() {
public void TimeOfDay()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay == DateTime.Now.TimeOfDay).ToList());
data.Add(select.Where(a => a.Type.Time.TimeOfDay > DateTime.Now.TimeOfDay).ToList());
@ -119,7 +130,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((timestampdiff(microsecond, date_format(a__Type__Parent.`Time2`, '1970-1-1 %H:%i:%s.%f'), a__Type__Parent.`Time2`) + 62135596800000000) > (timestampdiff(microsecond, date_format(now(), '1970-1-1 %H:%i:%s.%f'), now()) + 62135596800000000))
}
[Fact]
public void DayOfWeek() {
public void DayOfWeek()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.DayOfWeek > DateTime.Now.DayOfWeek).ToList());
data.Add(select.Where(a => a.Type.Time.DayOfWeek > DateTime.Now.DayOfWeek).ToList());
@ -137,7 +149,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((dayofweek(a__Type__Parent.`Time2`) - 1) > (dayofweek(now()) - 1))
}
[Fact]
public void Day() {
public void Day()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Day > DateTime.Now.Day).ToList());
data.Add(select.Where(a => a.Type.Time.Day > DateTime.Now.Day).ToList());
@ -155,7 +168,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (dayofmonth(a__Type__Parent.`Time2`) > dayofmonth(now()))
}
[Fact]
public void DayOfYear() {
public void DayOfYear()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.DayOfYear > DateTime.Now.DayOfYear).ToList());
data.Add(select.Where(a => a.Type.Time.DayOfYear > DateTime.Now.DayOfYear).ToList());
@ -173,7 +187,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (dayofyear(a__Type__Parent.`Time2`) > dayofyear(now()))
}
[Fact]
public void Month() {
public void Month()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Month > DateTime.Now.Month).ToList());
data.Add(select.Where(a => a.Type.Time.Month > DateTime.Now.Month).ToList());
@ -191,7 +206,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (month(a__Type__Parent.`Time2`) > month(now()))
}
[Fact]
public void Year() {
public void Year()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Year > DateTime.Now.Year).ToList());
data.Add(select.Where(a => a.Type.Time.Year > DateTime.Now.Year).ToList());
@ -209,7 +225,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (year(a__Type__Parent.`Time2`) > year(now()))
}
[Fact]
public void Hour() {
public void Hour()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Hour > DateTime.Now.Hour).ToList());
data.Add(select.Where(a => a.Type.Time.Hour > DateTime.Now.Hour).ToList());
@ -227,7 +244,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (hour(a__Type__Parent.`Time2`) > hour(now()))
}
[Fact]
public void Minute() {
public void Minute()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Minute > DateTime.Now.Minute).ToList());
data.Add(select.Where(a => a.Type.Time.Minute > DateTime.Now.Minute).ToList());
@ -245,7 +263,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (minute(a__Type__Parent.`Time2`) > minute(now()))
}
[Fact]
public void Second() {
public void Second()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Second > DateTime.Now.Second).ToList());
data.Add(select.Where(a => a.Type.Time.Second > DateTime.Now.Second).ToList());
@ -263,7 +282,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (second(a__Type__Parent.`Time2`) > second(now()))
}
[Fact]
public void Millisecond() {
public void Millisecond()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Millisecond > DateTime.Now.Millisecond).ToList());
data.Add(select.Where(a => a.Type.Time.Millisecond > DateTime.Now.Millisecond).ToList());
@ -281,7 +301,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (floor(microsecond(a__Type__Parent.`Time2`) / 1000) > floor(microsecond(now()) / 1000))
}
[Fact]
public void Ticks() {
public void Ticks()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Ticks > DateTime.Now.Ticks).ToList());
data.Add(select.Where(a => a.Type.Time.Ticks > DateTime.Now.Ticks).ToList());
@ -299,7 +320,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((timestampdiff(microsecond, '1970-1-1', a__Type__Parent.`Time2`) * 10 + 621355968000000000) > (timestampdiff(microsecond, '1970-1-1', now()) * 10 + 621355968000000000))
}
[Fact]
public void Add() {
public void Add()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Add(TimeSpan.FromDays(1)) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.Add(TimeSpan.FromDays(1)) > DateTime.Now).ToList());
@ -317,7 +339,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval ((1 * 86400000000)) microsecond) > now())
}
[Fact]
public void AddDays() {
public void AddDays()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddDays(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddDays(1) > DateTime.Now).ToList());
@ -335,7 +358,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) day) > now())
}
[Fact]
public void AddHours() {
public void AddHours()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddHours(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddHours(1) > DateTime.Now).ToList());
@ -353,7 +377,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) hour) > now())
}
[Fact]
public void AddMilliseconds() {
public void AddMilliseconds()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddMilliseconds(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddMilliseconds(1) > DateTime.Now).ToList());
@ -371,7 +396,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) * 1000 microsecond) > now())
}
[Fact]
public void AddMinutes() {
public void AddMinutes()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddMinutes(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddMinutes(1) > DateTime.Now).ToList());
@ -389,7 +415,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) minute) > now())
}
[Fact]
public void AddMonths() {
public void AddMonths()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddMonths(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddMonths(1) > DateTime.Now).ToList());
@ -407,7 +434,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) month) > now())
}
[Fact]
public void AddSeconds() {
public void AddSeconds()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddSeconds(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddSeconds(1) > DateTime.Now).ToList());
@ -425,7 +453,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) second) > now())
}
[Fact]
public void AddTicks() {
public void AddTicks()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddTicks(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddTicks(1) > DateTime.Now).ToList());
@ -443,7 +472,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) / 10 microsecond) > now())
}
[Fact]
public void AddYears() {
public void AddYears()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddYears(1) > DateTime.Now).ToList());
data.Add(select.Where(a => a.Type.Time.AddYears(1) > DateTime.Now).ToList());
@ -461,7 +491,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (date_add(a__Type__Parent.`Time2`, interval (1) year) > now())
}
[Fact]
public void Subtract() {
public void Subtract()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.Subtract(DateTime.Now).TotalSeconds > 0).ToList());
data.Add(select.Where(a => a.Type.Time.Subtract(DateTime.Now).TotalSeconds > 0).ToList());
@ -493,7 +524,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (date_sub(a__Type__Parent.`Time2`, interval ((1 * 86400000000)) microsecond) > a.`CreateTime`)
}
[Fact]
public void Á½¸öÈÕÆÚÏà¼õ§¹ûͬSubtract() {
public void Á½¸öÈÕÆÚÏà¼õ§¹ûͬSubtract()
{
var data = new List<object>();
data.Add(select.Where(a => (a.CreateTime - DateTime.Now).TotalSeconds > 0).ToList());
data.Add(select.Where(a => (a.Type.Time - DateTime.Now).TotalSeconds > 0).ToList());
@ -525,7 +557,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (date_sub(a__Type__Parent.`Time2`, interval ((1 * 86400000000)) microsecond) > a.`CreateTime`)
}
[Fact]
public void this_Equals() {
public void this_Equals()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.AddYears(1).Equals(DateTime.Now)).ToList());
data.Add(select.Where(a => a.Type.Time.AddYears(1).Equals(DateTime.Now)).ToList());
@ -543,7 +576,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((date_add(a__Type__Parent.`Time2`, interval (1) year) = now()))
}
[Fact]
public void this_ToString() {
public void this_ToString()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.ToString().Equals(DateTime.Now)).ToList());
data.Add(select.Where(a => a.Type.Time.AddYears(1).ToString().Equals(DateTime.Now)).ToList());
@ -562,7 +596,8 @@ namespace FreeSql.Tests.MySqlExpression {
}
[Fact]
public void DateTime_Compare() {
public void DateTime_Compare()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.CompareTo(DateTime.Now) == 0).ToList());
data.Add(select.Where(a => a.Type.Time.AddYears(1).CompareTo(DateTime.Now) == 0).ToList());
@ -580,7 +615,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((date_add(a__Type__Parent.`Time2`, interval (1) year)) - (now())) = 0)
}
[Fact]
public void DateTime_DaysInMonth() {
public void DateTime_DaysInMonth()
{
var data = new List<object>();
data.Add(select.Where(a => DateTime.DaysInMonth(a.CreateTime.Year, a.CreateTime.Month) > 30).ToList());
data.Add(select.Where(a => DateTime.DaysInMonth(a.Type.Time.Year, a.Type.Time.Month) > 30).ToList());
@ -598,7 +634,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (dayofmonth(last_day(concat(year(a__Type__Parent.`Time2`), month(a__Type__Parent.`Time2`), '-01'))) > 30)
}
[Fact]
public void DateTime_Equals() {
public void DateTime_Equals()
{
var data = new List<object>();
data.Add(select.Where(a => DateTime.Equals(a.CreateTime.AddYears(1), DateTime.Now)).ToList());
data.Add(select.Where(a => DateTime.Equals(a.Type.Time.AddYears(1), DateTime.Now)).ToList());
@ -616,7 +653,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((date_add(a__Type__Parent.`Time2`, interval (1) year) = now()))
}
[Fact]
public void DateTime_IsLeapYear() {
public void DateTime_IsLeapYear()
{
var data = new List<object>();
data.Add(select.Where(a => DateTime.IsLeapYear(a.CreateTime.Year)).ToList());
data.Add(select.Where(a => DateTime.IsLeapYear(a.Type.Time.AddYears(1).Year)).ToList());
@ -634,7 +672,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((year(date_add(a__Type__Parent.`Time2`, interval (1) year))) % 4 = 0 AND (year(date_add(a__Type__Parent.`Time2`, interval (1) year))) % 100 <> 0 OR (year(date_add(a__Type__Parent.`Time2`, interval (1) year))) % 400 = 0))
}
[Fact]
public void DateTime_Parse() {
public void DateTime_Parse()
{
var data = new List<object>();
data.Add(select.Where(a => DateTime.Parse(a.CreateTime.ToString()) > DateTime.Now).ToList());
data.Add(select.Where(a => DateTime.Parse(a.Type.Time.AddYears(1).ToString()) > DateTime.Now).ToList());

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlExpression {
public class MathTest {
namespace FreeSql.Tests.MySqlExpression
{
public class MathTest
{
ISelect<Topic> select => g.mysql.Select<Topic>();
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -19,13 +22,15 @@ namespace FreeSql.Tests.MySqlExpression {
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
class TestTypeInfo {
class TestTypeInfo
{
public int Guid { get; set; }
public int ParentId { get; set; }
public TestTypeParentInfo Parent { get; set; }
public string Name { get; set; }
}
class TestTypeParentInfo {
class TestTypeParentInfo
{
public int Id { get; set; }
public string Name { get; set; }
@ -33,98 +38,117 @@ namespace FreeSql.Tests.MySqlExpression {
}
[Fact]
public void PI() {
public void PI()
{
var data = new List<object>();
data.Add(select.Where(a => Math.PI + a.Clicks > 0).ToList());
}
[Fact]
public void Abs() {
public void Abs()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Abs(-a.Clicks) > 0).ToList());
}
[Fact]
public void Sign() {
public void Sign()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Sign(-a.Clicks) > 0).ToList());
}
[Fact]
public void Floor() {
public void Floor()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Floor(a.Clicks + 0.5) == a.Clicks).ToList());
}
[Fact]
public void Ceiling() {
public void Ceiling()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Ceiling(a.Clicks + 0.5) == a.Clicks + 1).ToList());
}
[Fact]
public void Round() {
public void Round()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Round(a.Clicks + 0.5) == a.Clicks).ToList());
data.Add(select.Where(a => Math.Round(a.Clicks + 0.5, 1) > a.Clicks).ToList());
}
[Fact]
public void Exp() {
public void Exp()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Exp(1) == a.Clicks + 1).ToList());
}
[Fact]
public void Log() {
public void Log()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Log(a.Clicks + 0.5) == a.Clicks + 1).ToList());
}
[Fact]
public void Log10() {
public void Log10()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Log10(a.Clicks + 0.5) == a.Clicks + 1).ToList());
}
[Fact]
public void Pow() {
public void Pow()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Pow(2, a.Clicks) == a.Clicks + 1).ToList());
}
[Fact]
public void Sqrt() {
public void Sqrt()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Sqrt(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList());
}
[Fact]
public void Cos() {
public void Cos()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Cos(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList());
}
[Fact]
public void Sin() {
public void Sin()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Sin(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList());
}
[Fact]
public void Tan() {
public void Tan()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Tan(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList());
}
[Fact]
public void Acos() {
public void Acos()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Acos(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList());
}
[Fact]
public void Asin() {
public void Asin()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Asin(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList());
}
[Fact]
public void Atan() {
public void Atan()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Atan(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList());
}
[Fact]
public void Atan2() {
public void Atan2()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Atan2(2, a.Clicks) == a.Clicks + 1).ToList());
}
[Fact]
public void Truncate() {
public void Truncate()
{
var data = new List<object>();
data.Add(select.Where(a => Math.Truncate(a.Clicks * 1.0 / 3) == a.Clicks + 1).ToList());
}

View File

@ -5,17 +5,21 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlExpression {
public class OtherTest {
namespace FreeSql.Tests.MySqlExpression
{
public class OtherTest
{
ISelect<TableAllType> select => g.mysql.Select<TableAllType>();
public OtherTest() {
public OtherTest()
{
}
[Fact]
public void Boolean() {
public void Boolean()
{
var t1 = select.Where(a => a.testFieldBool == true).ToList();
var t2 = select.Where(a => a.testFieldBool != true).ToList();
var t3 = select.Where(a => a.testFieldBool == false).ToList();
@ -30,7 +34,8 @@ namespace FreeSql.Tests.MySqlExpression {
}
[Fact]
public void Array() {
public void Array()
{
int[] nullarr = null;
Assert.Throws<MySqlException>(() => { select.Where(a => nullarr.Contains(a.testFieldInt)).ToList(); });
Assert.Throws<MySqlException>(() => { select.Where(a => new int[0].Contains(a.testFieldInt)).ToList(); });
@ -64,7 +69,8 @@ namespace FreeSql.Tests.MySqlExpression {
}
[Table(Name = "tb_alltype")]
class TableAllType {
class TableAllType
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlExpression {
public class StringTest {
namespace FreeSql.Tests.MySqlExpression
{
public class StringTest
{
ISelect<Topic> select => g.mysql.Select<Topic>();
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -19,26 +22,30 @@ namespace FreeSql.Tests.MySqlExpression {
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
class TestTypeInfo {
class TestTypeInfo
{
[Column(IsIdentity = true)]
public int Guid { get; set; }
public int ParentId { get; set; }
public TestTypeParentInfo Parent { get; set; }
public string Name { get; set; }
}
class TestTypeParentInfo {
class TestTypeParentInfo
{
public int Id { get; set; }
public string Name { get; set; }
public List<TestTypeInfo> Types { get; set; }
}
class TestEqualsGuid {
class TestEqualsGuid
{
public Guid id { get; set; }
public bool IsDeleted { get; set; }
}
[Fact]
public void Equals__() {
public void Equals__()
{
var list = new List<object>();
list.Add(select.Where(a => a.Title.Equals("aaa")).ToList());
list.Add(g.mysql.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
@ -46,7 +53,8 @@ namespace FreeSql.Tests.MySqlExpression {
}
[Fact]
public void Empty() {
public void Empty()
{
var data = new List<object>();
data.Add(select.Where(a => (a.Title ?? "") == string.Empty).ToSql());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -55,7 +63,8 @@ namespace FreeSql.Tests.MySqlExpression {
}
[Fact]
public void StartsWith() {
public void StartsWith()
{
var list = new List<object>();
list.Add(select.Where(a => a.Title.StartsWith("aaa")).ToList());
list.Add(select.Where(a => a.Title.StartsWith(a.Title)).ToList());
@ -97,7 +106,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE((concat(a.`Title`, 'aaa')) LIKE concat('%', a__Type.`Name`))
}
[Fact]
public void EndsWith() {
public void EndsWith()
{
var list = new List<object>();
list.Add(select.Where(a => a.Title.EndsWith("aaa")).ToList());
list.Add(select.Where(a => a.Title.EndsWith(a.Title)).ToList());
@ -139,7 +149,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE((concat(a.`Title`, 'aaa')) LIKE concat(a__Type.`Name`, '%'))
}
[Fact]
public void Contains() {
public void Contains()
{
var list = new List<object>();
list.Add(select.Where(a => a.Title.Contains("aaa")).ToList());
list.Add(select.Where(a => a.Title.Contains(a.Title)).ToList());
@ -181,7 +192,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE((concat(a.`Title`, 'aaa')) LIKE concat('%', a__Type.`Name`, '%'))
}
[Fact]
public void ToLower() {
public void ToLower()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.ToLower() == "aaa").ToList());
data.Add(select.Where(a => a.Title.ToLower() == a.Title).ToList());
@ -223,7 +235,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE(lower(concat(lower(a.`Title`), 'aaa')) = a__Type.`Name`)
}
[Fact]
public void ToUpper() {
public void ToUpper()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.ToUpper() == "aaa").ToList());
data.Add(select.Where(a => a.Title.ToUpper() == a.Title).ToList());
@ -265,7 +278,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (upper(concat(upper(a.`Title`), 'aaa')) = a__Type.`Name`)
}
[Fact]
public void Substring() {
public void Substring()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.Substring(0) == "aaa").ToList());
data.Add(select.Where(a => a.Title.Substring(0) == a.Title).ToList());
@ -307,7 +321,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (substr(concat(substr(a.`Title`, 1), 'aaa'), 2, 2) = a__Type.`Name`)
}
[Fact]
public void Length() {
public void Length()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.Length == 0).ToList());
data.Add(select.Where(a => a.Title.Length == 1).ToList());
@ -349,7 +364,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (char_length(concat(a.`Title`, 'aaa')) = char_length(a__Type.`Name`))
}
[Fact]
public void IndexOf() {
public void IndexOf()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.IndexOf("aaa") == -1).ToList());
data.Add(select.Where(a => a.Title.IndexOf("aaa", 2) == -1).ToList());
@ -391,7 +407,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((locate(concat(a.`Title`, 'aaa'), 'aaa', 3) - 1) = char_length(a__Type.`Name`) + 1)
}
[Fact]
public void PadLeft() {
public void PadLeft()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.PadLeft(10, 'a') == "aaa").ToList());
data.Add(select.Where(a => a.Title.PadLeft(10, 'a') == a.Title).ToList());
@ -433,7 +450,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (lpad(concat(lpad(a.`Title`, 10, 'a'), 'aaa'), 20, 'b') = a__Type.`Name`)
}
[Fact]
public void PadRight() {
public void PadRight()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.PadRight(10, 'a') == "aaa").ToList());
data.Add(select.Where(a => a.Title.PadRight(10, 'a') == a.Title).ToList());
@ -475,7 +493,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (rpad(concat(rpad(a.`Title`, 10, 'a'), 'aaa'), 20, 'b') = a__Type.`Name`)
}
[Fact]
public void Trim() {
public void Trim()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.Trim() == "aaa").ToList());
data.Add(select.Where(a => a.Title.Trim('a') == a.Title).ToList());
@ -517,7 +536,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (trim('c' from trim('b' from trim('a' from concat(trim('c' from trim('b' from trim('a' from a.`Title`))), 'aaa')))) = a__Type.`Name`)
}
[Fact]
public void TrimStart() {
public void TrimStart()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.TrimStart() == "aaa").ToList());
data.Add(select.Where(a => a.Title.TrimStart('a') == a.Title).ToList());
@ -559,7 +579,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (trim(trailing 'c' from trim(leading 'c' from trim(trailing 'b' from trim(leading 'b' from trim(trailing 'a' from trim(leading 'a' from concat(trim(trailing 'c' from trim(leading 'c' from trim(trailing 'b' from trim(leading 'b' from trim(trailing 'a' from trim(leading 'a' from a.`Title`)))))), 'aaa'))))))) = a__Type.`Name`)
}
[Fact]
public void TrimEnd() {
public void TrimEnd()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.TrimEnd() == "aaa").ToList());
data.Add(select.Where(a => a.Title.TrimEnd('a') == a.Title).ToList());
@ -601,7 +622,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (trim(trailing 'c' from trim(trailing 'b' from trim(trailing 'a' from concat(trim(trailing 'c' from trim(trailing 'b' from trim(trailing 'a' from a.`Title`))), 'aaa')))) = a__Type.`Name`)
}
[Fact]
public void Replace() {
public void Replace()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.Replace("a", "b") == "aaa").ToList());
data.Add(select.Where(a => a.Title.Replace("a", "b").Replace("b", "c") == a.Title).ToList());
@ -643,7 +665,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (concat(replace(replace(replace(a.`Title`, 'a', 'b'), 'b', 'c'), a__Type.`Name`, 'a'), 'aaa') = a__Type.`Name`)
}
[Fact]
public void CompareTo() {
public void CompareTo()
{
var data = new List<object>();
data.Add(select.Where(a => a.Title.CompareTo(a.Title) == 0).ToList());
data.Add(select.Where(a => a.Title.CompareTo(a.Title) > 0).ToList());
@ -686,7 +709,8 @@ namespace FreeSql.Tests.MySqlExpression {
}
[Fact]
public void string_IsNullOrEmpty() {
public void string_IsNullOrEmpty()
{
var data = new List<object>();
data.Add(select.Where(a => string.IsNullOrEmpty(a.Title)).ToList());
data.Add(select.Where(a => string.IsNullOrEmpty(a.Title) == false).ToList());

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.MySqlExpression {
public class TimeSpanTest {
namespace FreeSql.Tests.MySqlExpression
{
public class TimeSpanTest
{
ISelect<Topic> select => g.mysql.Select<Topic>();
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -19,20 +22,23 @@ namespace FreeSql.Tests.MySqlExpression {
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
class TestTypeInfo {
class TestTypeInfo
{
public int Guid { get; set; }
public int ParentId { get; set; }
public TestTypeParentInfo Parent { get; set; }
public string Name { get; set; }
}
class TestTypeParentInfo {
class TestTypeParentInfo
{
public int Id { get; set; }
public string Name { get; set; }
public List<TestTypeInfo> Types { get; set; }
}
[Fact]
public void Zero() {
public void Zero()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay > TimeSpan.Zero).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -40,7 +46,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) > 0)
}
[Fact]
public void MinValue() {
public void MinValue()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay > TimeSpan.MinValue).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -48,7 +55,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) > -922337203685477580)
}
[Fact]
public void MaxValue() {
public void MaxValue()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay < TimeSpan.MaxValue).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -56,7 +64,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) < 922337203685477580)
}
[Fact]
public void Days() {
public void Days()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Days == 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -64,7 +73,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 86400000000) = 0)
}
[Fact]
public void Hours() {
public void Hours()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Hours > 0).ToSql());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -72,7 +82,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 3600000000) mod 24 > 0)
}
[Fact]
public void Milliseconds() {
public void Milliseconds()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Milliseconds > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -80,7 +91,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 1000 mod 1000) > 0)
}
[Fact]
public void Minutes() {
public void Minutes()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Minutes > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -88,7 +100,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 60000000 mod 60) > 0)
}
[Fact]
public void Seconds() {
public void Seconds()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Seconds > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -96,7 +109,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 1000000 mod 60) > 0)
}
[Fact]
public void Ticks() {
public void Ticks()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Ticks > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -104,7 +118,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) * 10) > 0)
}
[Fact]
public void TotalDays() {
public void TotalDays()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalDays > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -112,7 +127,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 86400000000) > 0)
}
[Fact]
public void TotalHours() {
public void TotalHours()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalHours > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -120,7 +136,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 3600000000) > 0)
}
[Fact]
public void TotalMilliseconds() {
public void TotalMilliseconds()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalMilliseconds > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -128,7 +145,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 1000) > 0)
}
[Fact]
public void TotalMinutes() {
public void TotalMinutes()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalMinutes > 0).ToSql());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -136,7 +154,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 60000000) > 0)
}
[Fact]
public void TotalSeconds() {
public void TotalSeconds()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalSeconds > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -144,7 +163,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 1000000) > 0)
}
[Fact]
public void Add() {
public void Add()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Add(TimeSpan.FromDays(1)) > TimeSpan.Zero).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -152,7 +172,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) + (1 * 86400000000)) > 0)
}
[Fact]
public void Subtract() {
public void Subtract()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Subtract(TimeSpan.FromDays(1)) > TimeSpan.Zero).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -160,7 +181,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) - (1 * 86400000000)) > 0)
}
[Fact]
public void CompareTo() {
public void CompareTo()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.CompareTo(TimeSpan.FromDays(1)) > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -168,7 +190,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) - ((1 * 86400000000))) > 0)
}
[Fact]
public void this_Equals() {
public void this_Equals()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.Equals(TimeSpan.FromDays(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -176,7 +199,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 86400000000)))
}
[Fact]
public void this_ToString() {
public void this_ToString()
{
var data = new List<object>();
data.Add(select.Where(a => a.CreateTime.TimeOfDay.ToString() == "ssss").ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -185,7 +209,8 @@ namespace FreeSql.Tests.MySqlExpression {
}
[Fact]
public void TimeSpan_Compare() {
public void TimeSpan_Compare()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Compare(a.CreateTime.TimeOfDay, TimeSpan.FromDays(1)) > 0).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -193,7 +218,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) - ((1 * 86400000000))) > 0)
}
[Fact]
public void TimeSpan_Equals() {
public void TimeSpan_Equals()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromDays(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -201,7 +227,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 86400000000)))
}
[Fact]
public void TimeSpan_FromDays() {
public void TimeSpan_FromDays()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromDays(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -209,7 +236,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 86400000000)))
}
[Fact]
public void TimeSpan_FromHours() {
public void TimeSpan_FromHours()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromHours(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -217,7 +245,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 3600000000)))
}
[Fact]
public void TimeSpan_FromMilliseconds() {
public void TimeSpan_FromMilliseconds()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromMilliseconds(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -225,7 +254,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 1000)))
}
[Fact]
public void TimeSpan_FromMinutes() {
public void TimeSpan_FromMinutes()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromMinutes(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -233,7 +263,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 60000000)))
}
[Fact]
public void TimeSpan_FromSeconds() {
public void TimeSpan_FromSeconds()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromSeconds(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -241,7 +272,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 1000000)))
}
[Fact]
public void TimeSpan_FromTicks() {
public void TimeSpan_FromTicks()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromTicks(1))).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
@ -249,7 +281,8 @@ namespace FreeSql.Tests.MySqlExpression {
//WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 / 10)))
}
[Fact]
public void TimeSpan_Parse() {
public void TimeSpan_Parse()
{
var data = new List<object>();
data.Add(select.Where(a => TimeSpan.Parse(a.CreateTime.TimeOfDay.ToString()) > TimeSpan.Zero).ToList());
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.Oracle {
public class OracleDeleteTest {
namespace FreeSql.Tests.Oracle
{
public class OracleDeleteTest
{
IDelete<Topic> delete => g.oracle.Delete<Topic>(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
[Table(Name = "tb_topic22211")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int? Clicks { get; set; }
@ -20,7 +23,8 @@ namespace FreeSql.Tests.Oracle {
}
[Fact]
public void Dywhere() {
public void Dywhere()
{
Assert.Null(g.oracle.Delete<Topic>().ToSql());
var sql = g.oracle.Delete<Topic>(new[] { 1, 2 }).ToSql();
Assert.Equal("DELETE FROM \"TB_TOPIC22211\" WHERE (\"ID\" = 1 OR \"ID\" = 2)", sql);
@ -36,7 +40,8 @@ namespace FreeSql.Tests.Oracle {
}
[Fact]
public void Where() {
public void Where()
{
var sql = delete.Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("DELETE FROM \"TB_TOPIC22211\" WHERE (\"ID\" = 1)", sql);
@ -54,24 +59,28 @@ namespace FreeSql.Tests.Oracle {
Assert.Equal("DELETE FROM \"TB_TOPIC22211\" WHERE (\"ID\" IN (1,2,3,4,5,6,7,8,9,10))", sql);
}
[Fact]
public void WhereExists() {
public void WhereExists()
{
}
[Fact]
public void ExecuteAffrows() {
public void ExecuteAffrows()
{
var id = g.oracle.Insert<Topic>(new Topic { Title = "xxxx", CreateTime = DateTime.Now }).ExecuteIdentity();
Assert.Equal(1, delete.Where(a => a.Id == id).ExecuteAffrows());
}
[Fact]
public void ExecuteDeleted() {
public void ExecuteDeleted()
{
//var item = g.oracle.Insert<Topic>(new Topic { Title = "xxxx", CreateTime = DateTime.Now }).ExecuteInserted();
//Assert.Equal(item[0].Id, delete.Where(a => a.Id == item[0].Id).ExecuteDeleted()[0].Id);
}
[Fact]
public void AsTable() {
public void AsTable()
{
Assert.Null(g.oracle.Delete<Topic>().ToSql());
var sql = g.oracle.Delete<Topic>(new[] { 1, 2 }).AsTable(a => "TopicAsTable").ToSql();
Assert.Equal("DELETE FROM \"TopicAsTable\" WHERE (\"ID\" = 1 OR \"ID\" = 2)", sql);

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.Oracle {
public class OracleInsertTest {
namespace FreeSql.Tests.Oracle
{
public class OracleInsertTest
{
IInsert<Topic> insert => g.oracle.Insert<Topic>(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
[Table(Name = "tb_topic_insert")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int? Clicks { get; set; }
@ -20,7 +23,8 @@ namespace FreeSql.Tests.Oracle {
}
[Fact]
public void AppendData() {
public void AppendData()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
@ -76,7 +80,8 @@ INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(:Clicks_9, :Title_9)
}
[Fact]
public void InsertColumns() {
public void InsertColumns()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
@ -96,7 +101,7 @@ INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES(:Title_9)
SELECT 1 FROM DUAL", sql);
data.Add(insert.AppendData(items.First()).ExecuteIdentity());
sql = insert.AppendData(items).InsertColumns(a =>new { a.Title, a.Clicks }).ToSql();
sql = insert.AppendData(items).InsertColumns(a => new { a.Title, a.Clicks }).ToSql();
Assert.Equal(@"INSERT ALL
INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(:Clicks_0, :Title_0)
INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(:Clicks_1, :Title_1)
@ -112,7 +117,8 @@ INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(:Clicks_9, :Title_9)
data.Add(insert.AppendData(items.First()).ExecuteIdentity());
}
[Fact]
public void IgnoreColumns() {
public void IgnoreColumns()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
@ -148,7 +154,8 @@ INTO ""TB_TOPIC_INSERT""(""CLICKS"") VALUES(:Clicks_9)
data.Add(insert.AppendData(items.First()).ExecuteIdentity());
}
[Fact]
public void ExecuteAffrows() {
public void ExecuteAffrows()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
@ -156,14 +163,16 @@ INTO ""TB_TOPIC_INSERT""(""CLICKS"") VALUES(:Clicks_9)
Assert.Equal(10, insert.AppendData(items).ExecuteAffrows());
}
[Fact]
public void ExecuteIdentity() {
public void ExecuteIdentity()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
Assert.NotEqual(0, insert.AppendData(items.First()).ExecuteIdentity());
}
[Fact]
public void ExecuteInserted() {
public void ExecuteInserted()
{
//var items = new List<Topic>();
//for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
@ -171,7 +180,8 @@ INTO ""TB_TOPIC_INSERT""(""CLICKS"") VALUES(:Clicks_9)
}
[Fact]
public void AsTable() {
public void AsTable()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newTitle{a}", Clicks = a * 100 });

View File

@ -4,13 +4,16 @@ using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.Oracle {
public class OracleSelectTest {
namespace FreeSql.Tests.Oracle
{
public class OracleSelectTest
{
ISelect<Topic> select => g.oracle.Select<Topic>();
[Table(Name = "tb_topic22")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
@ -19,21 +22,24 @@ namespace FreeSql.Tests.Oracle {
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
class TestTypeInfo {
class TestTypeInfo
{
[Column(IsIdentity = true)]
public int Guid { get; set; }
public int ParentId { get; set; }
public TestTypeParentInfo Parent { get; set; }
public string Name { get; set; }
}
class TestTypeParentInfo {
class TestTypeParentInfo
{
public int Id { get; set; }
public string Name { get; set; }
public List<TestTypeInfo> Types { get; set; }
}
class TopicInserts {
class TopicInserts
{
public Guid Id { get; set; }
public int Clicks { get; set; }
public int TypeGuid { get; set; }
@ -41,7 +47,8 @@ namespace FreeSql.Tests.Oracle {
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
public partial class Song {
public partial class Song
{
[Column(IsIdentity = true)]
public int Id { get; set; }
public DateTime? Create_time { get; set; }
@ -51,14 +58,16 @@ namespace FreeSql.Tests.Oracle {
public virtual ICollection<Tag> Tags { get; set; }
}
public partial class Song_tag {
public partial class Song_tag
{
public int Song_id { get; set; }
public virtual Song Song { get; set; }
public int Tag_id { get; set; }
public virtual Tag Tag { get; set; }
}
public partial class Tag {
public partial class Tag
{
[Column(IsIdentity = true)]
public int Id { get; set; }
public int? Parent_id { get; set; }
@ -72,7 +81,8 @@ namespace FreeSql.Tests.Oracle {
}
[Fact]
public void AsSelect() {
public void AsSelect()
{
//OneToOne、ManyToOne
var t0 = g.oracle.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
//SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
@ -105,7 +115,8 @@ namespace FreeSql.Tests.Oracle {
}
[Fact]
public void Lazy() {
public void Lazy()
{
var tags = g.oracle.Select<Tag>().Where(a => a.Parent.Name == "xxx")
.LeftJoin(a => a.Parent_id == a.Parent.Id)
.ToSql();
@ -114,7 +125,8 @@ namespace FreeSql.Tests.Oracle {
}
[Fact]
public void ToDataTable() {
public void ToDataTable()
{
var items = new List<TopicInserts>();
for (var a = 0; a < 11; a++) items.Add(new TopicInserts { Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
@ -128,13 +140,15 @@ namespace FreeSql.Tests.Oracle {
var dt2 = select.Limit(10).ToDataTable("id, 111222");
var dt3 = select.Limit(10).ToDataTable(a => new { a.Id, a.Type.Name, now = DateTime.Now });
}
class TestDto {
class TestDto
{
public int id { get; set; }
public string name { get; set; } //这是join表的属性
public int ParentId { get; set; } //这是join表的属性
}
[Fact]
public void ToList() {
public void ToList()
{
var testDto1 = select.Limit(10).ToList(a => new TestDto { id = a.Id, name = a.Title });
var testDto2 = select.Limit(10).ToList(a => new TestDto());
@ -153,20 +167,24 @@ namespace FreeSql.Tests.Oracle {
var t11 = select.Where(a => a.Type.Name.Length > 0).ToList(true);
var t21 = select.Where(a => a.Type.Parent.Name.Length > 0).ToList(true);
}
class TestGuidIdToList {
class TestGuidIdToList
{
public Guid id { get; set; }
public string title { get; set; } = Guid.NewGuid().ToString();
}
[Fact]
public void ToOne() {
public void ToOne()
{
var testnotfind = select.Where("1=2").First(a => a.CreateTime);
Assert.Equal(default(DateTime), testnotfind);
}
[Fact]
public void ToSql() {
public void ToSql()
{
}
[Fact]
public void Any() {
public void Any()
{
var count = select.Where(a => 1 == 1).Count();
Assert.False(select.Where(a => 1 == 2).Any());
Assert.Equal(count > 0, select.Where(a => 1 == 1).Any());
@ -188,18 +206,21 @@ namespace FreeSql.Tests.Oracle {
collectionSelect.ToList();
}
[Fact]
public void Count() {
public void Count()
{
var count = select.Where(a => 1 == 1).Count();
select.Where(a => 1 == 1).Count(out var count2);
Assert.Equal(count, count2);
Assert.Equal(0, select.Where(a => 1 == 2).Count());
}
[Fact]
public void Master() {
public void Master()
{
Assert.StartsWith(" SELECT", select.Master().Where(a => 1 == 1).ToSql());
}
[Fact]
public void From() {
public void From()
{
var query2 = select.From<TestTypeInfo>((s, b) => s
.LeftJoin(a => a.TypeGuid == b.Guid)
);
@ -216,7 +237,8 @@ namespace FreeSql.Tests.Oracle {
query3.ToList();
}
[Fact]
public void LeftJoin() {
public void LeftJoin()
{
//<2F><><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a.Type<70><65>a.Type.Parent <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
var query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid);
var sql = query.ToSql().Replace("\r\n", "");
@ -284,7 +306,8 @@ namespace FreeSql.Tests.Oracle {
query.ToList();
}
[Fact]
public void InnerJoin() {
public void InnerJoin()
{
//<2F><><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a.Type<70><65>a.Type.Parent <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
var query = select.InnerJoin(a => a.Type.Guid == a.TypeGuid);
var sql = query.ToSql().Replace("\r\n", "");
@ -353,7 +376,8 @@ namespace FreeSql.Tests.Oracle {
}
[Fact]
public void RightJoin() {
public void RightJoin()
{
//<2F><><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a.Type<70><65>a.Type.Parent <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
var query = select.RightJoin(a => a.Type.Guid == a.TypeGuid);
var sql = query.ToSql().Replace("\r\n", "");
@ -422,7 +446,8 @@ namespace FreeSql.Tests.Oracle {
}
[Fact]
public void Where() {
public void Where()
{
var sqltmp1 = select.Where(a => a.Id == 0 && (a.Title == "x" || a.Title == "y") && a.Clicks == 1).ToSql();
var sqltmp2 = select.Where(a => a.Id.Equals(true) && (a.Title.Equals("x") || a.Title.Equals("y")) && a.Clicks.Equals(1)).ToSql();
var sqltmp3 = select.Where(a => a.Id == 0).Where(a => ((a.Title == "x" && a.Title == "z") || a.Title == "y")).ToSql();
@ -491,7 +516,8 @@ namespace FreeSql.Tests.Oracle {
query.ToList();
}
[Fact]
public void WhereIf() {
public void WhereIf()
{
//<2F><><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a.Type<70><65>a.Type.Parent <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
var query = select.WhereIf(true, a => a.Id == 10);
var sql = query.ToSql().Replace("\r\n", "");
@ -585,7 +611,8 @@ namespace FreeSql.Tests.Oracle {
query.ToList();
}
[Fact]
public void WhereExists() {
public void WhereExists()
{
var sql2222 = select.Where(a => select.Where(b => b.Id == a.Id).Any()).ToList();
sql2222 = select.Where(a =>
@ -598,7 +625,8 @@ namespace FreeSql.Tests.Oracle {
).ToList();
}
[Fact]
public void GroupBy() {
public void GroupBy()
{
var groupby = select.From<TestTypeInfo, TestTypeParentInfo>((s, b, c) => s
.Where(a => a.Id == 1)
)
@ -609,7 +637,8 @@ namespace FreeSql.Tests.Oracle {
.OrderByDescending(a => a.Count())
.Offset(10)
.Limit(2)
.ToList(a => new {
.ToList(a => new
{
a.Key.tt2,
cou1 = a.Count(),
arg1 = a.Avg(a.Key.mod4),
@ -623,7 +652,8 @@ namespace FreeSql.Tests.Oracle {
var aggsql1 = select
.GroupBy(a => a.Title)
.ToSql(b => new {
.ToSql(b => new
{
b.Key,
cou = b.Count(),
sum = b.Sum(b.Key),
@ -631,7 +661,8 @@ namespace FreeSql.Tests.Oracle {
});
var aggtolist1 = select
.GroupBy(a => a.Title)
.ToList(b => new {
.ToList(b => new
{
b.Key,
cou = b.Count(),
sum = b.Sum(b.Key),
@ -640,7 +671,8 @@ namespace FreeSql.Tests.Oracle {
var aggsql2 = select
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
.ToSql(b => new {
.ToSql(b => new
{
b.Key.Title,
b.Key.yyyy,
@ -650,7 +682,8 @@ namespace FreeSql.Tests.Oracle {
});
var aggtolist2 = select
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
.ToList(b => new {
.ToList(b => new
{
b.Key.Title,
b.Key.yyyy,
@ -661,7 +694,8 @@ namespace FreeSql.Tests.Oracle {
var aggsql3 = select
.GroupBy(a => a.Title)
.ToSql(b => new {
.ToSql(b => new
{
b.Key,
cou = b.Count(),
sum = b.Sum(b.Key),
@ -670,23 +704,28 @@ namespace FreeSql.Tests.Oracle {
});
}
[Fact]
public void ToAggregate() {
public void ToAggregate()
{
var sql = select.ToAggregate(a => new { sum = a.Sum(a.Key.Id + 11.11), avg = a.Avg(a.Key.Id), count = a.Count(), max = a.Max(a.Key.Id), min = a.Min(a.Key.Id) });
}
[Fact]
public void OrderBy() {
public void OrderBy()
{
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList();
}
[Fact]
public void Skip_Offset() {
public void Skip_Offset()
{
var sql = select.Offset(10).ToList();
}
[Fact]
public void Take_Limit() {
public void Take_Limit()
{
var sql = select.Limit(10).ToList();
}
[Fact]
public void Page() {
public void Page()
{
var sql1 = select.Page(1, 10).ToList();
var sql2 = select.Page(2, 10).ToList();
var sql3 = select.Page(3, 10).ToList();
@ -696,33 +735,41 @@ namespace FreeSql.Tests.Oracle {
var sql33 = select.OrderBy(a => new Random().NextDouble()).Page(3, 10).ToList();
}
[Fact]
public void Distinct() {
public void Distinct()
{
var t1 = select.Distinct().ToList(a => a.Title);
var t2 = select.Distinct().Limit(10).ToList(a => a.Title);
}
[Fact]
public void Sum() {
public void Sum()
{
}
[Fact]
public void Min() {
public void Min()
{
}
[Fact]
public void Max() {
public void Max()
{
}
[Fact]
public void Avg() {
public void Avg()
{
}
[Fact]
public void As() {
public void As()
{
}
[Fact]
public void AsTable() {
public void AsTable()
{
var listt = select.AsTable((a, b) => "(select * from tb_topic where clicks > 10)").Page(1, 10).ToList();
Func<Type, string, string> tableRule = (type, oldname) => {
Func<Type, string, string> tableRule = (type, oldname) =>
{
if (type == typeof(Topic)) return oldname + "AsTable1";
else if (type == typeof(TestTypeInfo)) return oldname + "AsTable2";
return oldname + "AsTable";
@ -784,14 +831,16 @@ namespace FreeSql.Tests.Oracle {
Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22AsTable1\" a LEFT JOIN \"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = :bname", sql);
}
public class TiOtmModel1 {
public class TiOtmModel1
{
[Column(IsIdentity = true)]
public int id { get; set; }
public virtual TiOtmModel2 model2 { get; set; }
public string m1name { get; set; }
}
public class TiOtmModel2 {
public class TiOtmModel2
{
[Column(IsPrimary = true)]
public int model2id { get; set; }
public virtual TiOtmModel1 model1 { get; set; }
@ -800,7 +849,8 @@ namespace FreeSql.Tests.Oracle {
public List<TiOtmModel3> childs { get; set; }
}
public class TiOtmModel3 {
public class TiOtmModel3
{
[Column(IsIdentity = true)]
public int id { get; set; }
@ -809,7 +859,8 @@ namespace FreeSql.Tests.Oracle {
public List<TiOtmModel4> childs2 { get; set; }
}
public class TiOtmModel4 {
public class TiOtmModel4
{
[Column(IsIdentity = true)]
public int id { get; set; }
@ -818,7 +869,8 @@ namespace FreeSql.Tests.Oracle {
}
[Fact]
public void Include_OneToMany() {
public void Include_OneToMany()
{
var model1 = new TiOtmModel1 { m1name = DateTime.Now.Second.ToString() };
model1.id = (int)g.oracle.Insert(model1).ExecuteIdentity();
var model2 = new TiOtmModel2 { model2id = model1.id, m2setting = DateTime.Now.Second.ToString() };
@ -873,7 +925,8 @@ namespace FreeSql.Tests.Oracle {
.ToList();
}
public class TiOtmModel11 {
public class TiOtmModel11
{
[Column(IsIdentity = true)]
public int id { get; set; }
public int model2id { get; set; }
@ -882,13 +935,15 @@ namespace FreeSql.Tests.Oracle {
public string m1name { get; set; }
}
public class TiOtmModel22 {
public class TiOtmModel22
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string m2setting { get; set; }
public List<TiOtmModel33> childs { get; set; }
}
public class TiOtmModel33 {
public class TiOtmModel33
{
[Column(IsIdentity = true)]
public int id { get; set; }
public int model2Id { get; set; }
@ -896,7 +951,8 @@ namespace FreeSql.Tests.Oracle {
public string setting { get; set; }
}
[Fact]
public void Include_OneToMany2() {
public void Include_OneToMany2()
{
string setting = "x";
var model2 = new TiOtmModel22 { m2setting = DateTime.Now.Second.ToString() };
model2.id = (int)g.oracle.Insert(model2).ExecuteIdentity();
@ -926,37 +982,44 @@ namespace FreeSql.Tests.Oracle {
}
[Fact]
public void Include_OneToChilds() {
var tag1 = new Tag {
public void Include_OneToChilds()
{
var tag1 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_01_中国"
};
tag1.Id = (int)g.oracle.Insert(tag1).ExecuteIdentity();
var tag1_1 = new Tag {
var tag1_1 = new Tag
{
Parent_id = tag1.Id,
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_01_北京"
};
tag1_1.Id = (int)g.oracle.Insert(tag1_1).ExecuteIdentity();
var tag1_2 = new Tag {
var tag1_2 = new Tag
{
Parent_id = tag1.Id,
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_01_上海"
};
tag1_2.Id = (int)g.oracle.Insert(tag1_2).ExecuteIdentity();
var tag2 = new Tag {
var tag2 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_02_美国"
};
tag2.Id = (int)g.oracle.Insert(tag2).ExecuteIdentity();
var tag2_1 = new Tag {
var tag2_1 = new Tag
{
Parent_id = tag2.Id,
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_02_纽约"
};
tag2_1.Id = (int)g.oracle.Insert(tag2_1).ExecuteIdentity();
var tag2_2 = new Tag {
var tag2_2 = new Tag
{
Parent_id = tag2.Id,
Ddd = DateTime.Now.Second,
Name = "test_oneToChilds_02_华盛顿"
@ -1016,37 +1079,44 @@ namespace FreeSql.Tests.Oracle {
}
[Fact]
public void Include_ManyToMany() {
public void Include_ManyToMany()
{
var tag1 = new Tag {
var tag1 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_manytoMany_01_中国"
};
tag1.Id = (int)g.oracle.Insert(tag1).ExecuteIdentity();
var tag2 = new Tag {
var tag2 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_manytoMany_02_美国"
};
tag2.Id = (int)g.oracle.Insert(tag2).ExecuteIdentity();
var tag3 = new Tag {
var tag3 = new Tag
{
Ddd = DateTime.Now.Second,
Name = "test_manytoMany_03_日本"
};
tag3.Id = (int)g.oracle.Insert(tag3).ExecuteIdentity();
var song1 = new Song {
var song1 = new Song
{
Create_time = DateTime.Now,
Title = "test_manytoMany_01_我是中国人.mp3",
Url = "http://ww.baidu.com/"
};
song1.Id = (int)g.oracle.Insert(song1).ExecuteIdentity();
var song2 = new Song {
var song2 = new Song
{
Create_time = DateTime.Now,
Title = "test_manytoMany_02_爱你一万年.mp3",
Url = "http://ww.163.com/"
};
song2.Id = (int)g.oracle.Insert(song2).ExecuteIdentity();
var song3 = new Song {
var song3 = new Song
{
Create_time = DateTime.Now,
Title = "test_manytoMany_03_千年等一回.mp3",
Url = "http://ww.sina.com/"

View File

@ -3,12 +3,15 @@ using System;
using System.Collections.Generic;
using Xunit;
namespace FreeSql.Tests.Oracle {
public class OracleUpdateTest {
namespace FreeSql.Tests.Oracle
{
public class OracleUpdateTest
{
IUpdate<Topic> update => g.oracle.Update<Topic>();
[Table(Name = "tb_topic")]
class Topic {
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int? Clicks { get; set; }
@ -18,7 +21,8 @@ namespace FreeSql.Tests.Oracle {
}
[Fact]
public void Dywhere() {
public void Dywhere()
{
Assert.Null(g.oracle.Update<Topic>().ToSql());
Assert.Equal("UPDATE \"TB_TOPIC\" SET title='test' \r\nWHERE (\"ID\" = 1 OR \"ID\" = 2)", g.oracle.Update<Topic>(new[] { 1, 2 }).SetRaw("title='test'").ToSql());
Assert.Equal("UPDATE \"TB_TOPIC\" SET title='test1' \r\nWHERE (\"ID\" = 1)", g.oracle.Update<Topic>(new Topic { Id = 1, Title = "test" }).SetRaw("title='test1'").ToSql());
@ -27,7 +31,8 @@ namespace FreeSql.Tests.Oracle {
}
[Fact]
public void SetSource() {
public void SetSource()
{
var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CLICKS\" = :p_0, \"TITLE\" = :p_1, \"CREATETIME\" = :p_2 WHERE (\"ID\" = 1)", sql);
@ -40,21 +45,24 @@ namespace FreeSql.Tests.Oracle {
sql = update.SetSource(items).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE \"TB_TOPIC\" SET \"TITLE\" = CASE \"ID\" WHEN 1 THEN :p_0 WHEN 2 THEN :p_1 WHEN 3 THEN :p_2 WHEN 4 THEN :p_3 WHEN 5 THEN :p_4 WHEN 6 THEN :p_5 WHEN 7 THEN :p_6 WHEN 8 THEN :p_7 WHEN 9 THEN :p_8 WHEN 10 THEN :p_9 END WHERE (\"ID\" IN (1,2,3,4,5,6,7,8,9,10))", sql);
sql = update.SetSource(items).Set(a => a.CreateTime, new DateTime(2020,1,1)).ToSql().Replace("\r\n", "");
sql = update.SetSource(items).Set(a => a.CreateTime, new DateTime(2020, 1, 1)).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CREATETIME\" = :p_0 WHERE (\"ID\" IN (1,2,3,4,5,6,7,8,9,10))", sql);
}
[Fact]
public void IgnoreColumns() {
public void IgnoreColumns()
{
var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE \"TB_TOPIC\" SET \"TITLE\" = :p_0 WHERE (\"ID\" = 1)", sql);
}
[Fact]
public void UpdateColumns() {
public void UpdateColumns()
{
var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).UpdateColumns(a => a.Title).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE \"TB_TOPIC\" SET \"TITLE\" = :p_0 WHERE (\"ID\" = 1)", sql);
}
[Fact]
public void Set() {
public void Set()
{
var sql = update.Where(a => a.Id == 1).Set(a => a.Title, "newtitle").ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE \"TB_TOPIC\" SET \"TITLE\" = :p_0 WHERE (\"ID\" = 1)", sql);
@ -81,12 +89,14 @@ namespace FreeSql.Tests.Oracle {
Assert.Equal("UPDATE \"TB_TOPIC\" SET \"ID\" = 10 WHERE (\"ID\" = 1)", sql);
}
[Fact]
public void SetRaw() {
public void SetRaw()
{
var sql = update.Where(a => a.Id == 1).SetRaw("clicks = clicks + :incrClick", new { incrClick = 1 }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE \"TB_TOPIC\" SET clicks = clicks + :incrClick WHERE (\"ID\" = 1)", sql);
}
[Fact]
public void Where() {
public void Where()
{
var sql = update.Where(a => a.Id == 1).SetRaw("title='newtitle'").ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE \"TB_TOPIC\" SET title='newtitle' WHERE (\"ID\" = 1)", sql);
@ -103,20 +113,24 @@ namespace FreeSql.Tests.Oracle {
Assert.Equal("UPDATE \"TB_TOPIC\" SET title='newtitle' WHERE (\"ID\" IN (1,2,3,4,5,6,7,8,9,10))", sql);
}
[Fact]
public void WhereExists() {
public void WhereExists()
{
}
[Fact]
public void ExecuteAffrows() {
public void ExecuteAffrows()
{
}
[Fact]
public void ExecuteUpdated() {
public void ExecuteUpdated()
{
}
[Fact]
public void AsTable() {
public void AsTable()
{
Assert.Null(g.oracle.Update<Topic>().ToSql());
Assert.Equal("UPDATE \"tb_topicAsTable\" SET title='test' \r\nWHERE (\"ID\" = 1 OR \"ID\" = 2)", g.oracle.Update<Topic>(new[] { 1, 2 }).SetRaw("title='test'").AsTable(a => "tb_topicAsTable").ToSql());
Assert.Equal("UPDATE \"tb_topicAsTable\" SET title='test1' \r\nWHERE (\"ID\" = 1)", g.oracle.Update<Topic>(new Topic { Id = 1, Title = "test" }).SetRaw("title='test1'").AsTable(a => "tb_topicAsTable").ToSql());

View File

@ -2,9 +2,12 @@ using FreeSql.DataAnnotations;
using System;
using Xunit;
namespace FreeSql.Tests.OracleMapType {
public class BoolNullableTest {
class BoolNullableMap {
namespace FreeSql.Tests.OracleMapType
{
public class BoolNullableTest
{
class BoolNullableMap
{
public Guid id { get; set; }
[Column(MapType = typeof(bool))]
public bool? tobool { get; set; } = true;
@ -57,7 +60,8 @@ namespace FreeSql.Tests.OracleMapType {
public bool? tostring { get; set; } = true;
}
[Fact]
public void Bool() {
public void Bool()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -138,7 +142,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void SByte() {
public void SByte()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -219,7 +224,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void SByteNullable() {
public void SByteNullable()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -300,7 +306,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Short() {
public void Short()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -381,7 +388,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ShortNullable() {
public void ShortNullable()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -462,7 +470,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Int() {
public void Int()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -543,7 +552,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void IntNullable() {
public void IntNullable()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -624,7 +634,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Long() {
public void Long()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -705,7 +716,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void LongNullable() {
public void LongNullable()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -787,7 +799,8 @@ namespace FreeSql.Tests.OracleMapType {
}
[Fact]
public void Byte() {
public void Byte()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -868,7 +881,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ByteNullable() {
public void ByteNullable()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -949,7 +963,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UShort() {
public void UShort()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -1030,7 +1045,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UShortNullable() {
public void UShortNullable()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -1111,7 +1127,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UInt() {
public void UInt()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -1192,7 +1209,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UIntNullable() {
public void UIntNullable()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -1273,7 +1291,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ULong() {
public void ULong()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -1354,7 +1373,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolNullableMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ULongNullable() {
public void ULongNullable()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -1436,23 +1456,29 @@ namespace FreeSql.Tests.OracleMapType {
}
[Fact]
public void TimeSpan() {
public void TimeSpan()
{
}
[Fact]
public void TimeSpanNullable() {
public void TimeSpanNullable()
{
}
[Fact]
public void DateTime() {
public void DateTime()
{
}
[Fact]
public void DateTimeNullable() {
public void DateTimeNullable()
{
}
[Fact]
public void ByteArray() {
public void ByteArray()
{
}
[Fact]
public void String() {
public void String()
{
//insert
var orm = g.oracle;
var item = new BoolNullableMap { };
@ -1534,29 +1560,37 @@ namespace FreeSql.Tests.OracleMapType {
}
[Fact]
public void Guid() {
public void Guid()
{
}
[Fact]
public void GuidNullable() {
public void GuidNullable()
{
}
[Fact]
public void MygisPoint() {
public void MygisPoint()
{
}
[Fact]
public void MygisLineString() {
public void MygisLineString()
{
}
[Fact]
public void MygisPolygon() {
public void MygisPolygon()
{
}
[Fact]
public void MygisMultiPoint() {
public void MygisMultiPoint()
{
}
[Fact]
public void MygisMultiLineString() {
public void MygisMultiLineString()
{
}
[Fact]
public void MygisMultiPolygon() {
public void MygisMultiPolygon()
{
}
}
}

View File

@ -2,10 +2,13 @@ using FreeSql.DataAnnotations;
using System;
using Xunit;
namespace FreeSql.Tests.OracleMapType {
public class BoolTest {
namespace FreeSql.Tests.OracleMapType
{
public class BoolTest
{
class BoolMap {
class BoolMap
{
public Guid id { get; set; }
[Column(MapType = typeof(bool?))]
public bool toboolnullable { get; set; } = true;
@ -59,7 +62,8 @@ namespace FreeSql.Tests.OracleMapType {
}
[Fact]
public void BoolNullable() {
public void BoolNullable()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -114,7 +118,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void SByte() {
public void SByte()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -169,7 +174,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void SByteNullable() {
public void SByteNullable()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -224,7 +230,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Short() {
public void Short()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -279,7 +286,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ShortNullable() {
public void ShortNullable()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -334,7 +342,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Int() {
public void Int()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -389,7 +398,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void IntNullable() {
public void IntNullable()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -444,7 +454,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void Long() {
public void Long()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -499,7 +510,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void LongNullable() {
public void LongNullable()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -555,7 +567,8 @@ namespace FreeSql.Tests.OracleMapType {
}
[Fact]
public void Byte() {
public void Byte()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -610,7 +623,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ByteNullable() {
public void ByteNullable()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -665,7 +679,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UShort() {
public void UShort()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -720,7 +735,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UShortNullable() {
public void UShortNullable()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -775,7 +791,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UInt() {
public void UInt()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -830,7 +847,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void UIntNullable() {
public void UIntNullable()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -885,7 +903,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ULong() {
public void ULong()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -940,7 +959,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<BoolMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void ULongNullable() {
public void ULongNullable()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -996,23 +1016,29 @@ namespace FreeSql.Tests.OracleMapType {
}
[Fact]
public void TimeSpan() {
public void TimeSpan()
{
}
[Fact]
public void TimeSpanNullable() {
public void TimeSpanNullable()
{
}
[Fact]
public void DateTime() {
public void DateTime()
{
}
[Fact]
public void DateTimeNullable() {
public void DateTimeNullable()
{
}
[Fact]
public void ByteArray() {
public void ByteArray()
{
}
[Fact]
public void String() {
public void String()
{
//insert
var orm = g.oracle;
var item = new BoolMap { };
@ -1068,29 +1094,37 @@ namespace FreeSql.Tests.OracleMapType {
}
[Fact]
public void Guid() {
public void Guid()
{
}
[Fact]
public void GuidNullable() {
public void GuidNullable()
{
}
[Fact]
public void MygisPoint() {
public void MygisPoint()
{
}
[Fact]
public void MygisLineString() {
public void MygisLineString()
{
}
[Fact]
public void MygisPolygon() {
public void MygisPolygon()
{
}
[Fact]
public void MygisMultiPoint() {
public void MygisMultiPoint()
{
}
[Fact]
public void MygisMultiLineString() {
public void MygisMultiLineString()
{
}
[Fact]
public void MygisMultiPolygon() {
public void MygisMultiPolygon()
{
}
}
}

View File

@ -3,9 +3,12 @@ using System;
using System.Numerics;
using Xunit;
namespace FreeSql.Tests.OracleMapType {
public class EnumTest {
class EnumTestMap {
namespace FreeSql.Tests.OracleMapType
{
public class EnumTest
{
class EnumTestMap
{
public Guid id { get; set; }
[Column(MapType = typeof(string))]
@ -20,7 +23,8 @@ namespace FreeSql.Tests.OracleMapType {
}
public enum ToStringMapEnum { ÖйúÈË, abc, Ïã¸Û }
[Fact]
public void EnumToString() {
public void EnumToString()
{
//insert
var orm = g.oracle;
var item = new EnumTestMap { };
@ -76,7 +80,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<EnumTestMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void EnumNullableToString() {
public void EnumNullableToString()
{
//insert
var orm = g.oracle;
var item = new EnumTestMap { };
@ -136,7 +141,8 @@ namespace FreeSql.Tests.OracleMapType {
}
[Fact]
public void EnumToInt() {
public void EnumToInt()
{
//insert
var orm = g.oracle;
var item = new EnumTestMap { };
@ -192,7 +198,8 @@ namespace FreeSql.Tests.OracleMapType {
Assert.Null(orm.Select<EnumTestMap>().Where(a => a.id == item.id).First());
}
[Fact]
public void EnumNullableToInt() {
public void EnumNullableToInt()
{
//insert
var orm = g.oracle;
var item = new EnumTestMap { };

Some files were not shown because too many files have changed in this diff Show More