{"id":13431258,"url":"https://github.com/shuxinqin/Chloe","last_synced_at":"2025-03-16T11:31:25.998Z","repository":{"id":38240422,"uuid":"54096321","full_name":"shuxinqin/Chloe","owner":"shuxinqin","description":"A lightweight and high-performance Object/Relational Mapping(ORM) library for .NET  --C#","archived":false,"fork":false,"pushed_at":"2025-02-17T15:51:11.000Z","size":21824,"stargazers_count":1528,"open_issues_count":18,"forks_count":454,"subscribers_count":145,"default_branch":"master","last_synced_at":"2025-03-13T05:01:47.692Z","etag":null,"topics":["c-sharp","chloe","dameng","dotnet","dotnetcore","kingbasees","mysql","oracle","orm","postgresql","sqlite"],"latest_commit_sha":null,"homepage":"https://github.com/shuxinqin/Chloe/wiki","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shuxinqin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-03-17T07:06:49.000Z","updated_at":"2025-03-08T23:01:39.000Z","dependencies_parsed_at":"2023-02-19T04:16:06.468Z","dependency_job_id":"eff14a40-b74f-4c4e-9eb6-f7872c596d5b","html_url":"https://github.com/shuxinqin/Chloe","commit_stats":{"total_commits":1142,"total_committers":4,"mean_commits":285.5,"dds":"0.035026269702276736","last_synced_commit":"712fefdd909a1166c06f10559b41d3fc0f8b7655"},"previous_names":[],"tags_count":43,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shuxinqin%2FChloe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shuxinqin%2FChloe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shuxinqin%2FChloe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shuxinqin%2FChloe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shuxinqin","download_url":"https://codeload.github.com/shuxinqin/Chloe/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243862831,"owners_count":20360220,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c-sharp","chloe","dameng","dotnet","dotnetcore","kingbasees","mysql","oracle","orm","postgresql","sqlite"],"created_at":"2024-07-31T02:01:01.728Z","updated_at":"2025-03-16T11:31:22.767Z","avatar_url":"https://github.com/shuxinqin.png","language":"C#","funding_links":[],"categories":["Frameworks, Libraries and Tools","框架, 库和工具","C#","C# #"],"sub_categories":["ORM","对象关系映射ORM"],"readme":"# Chloe(克洛伊)\nChloe is a lightweight Object/Relational Mapping(ORM) library.\nThe query interface is similar to LINQ. You can query data like LINQ and do any things(Join Query | Group Query | Aggregate Query | Insert | Batch Update | Batch Delete | Sharding) by lambda with Chloe.ORM.\n\n**Documentation**: [https://github.com/shuxinqin/Chloe/wiki](https://github.com/shuxinqin/Chloe/wiki \"https://github.com/shuxinqin/Chloe/wiki\")\n\n# NuGet Install Command\n\n|     Database         | Install Command  |\n| ------------ | --------------- |\n| SqlServer  | Install-Package Chloe.SqlServer  |\n| MySql  | Install-Package Chloe.MySql  |\n| Oracle  | Install-Package Chloe.Oracle  |\n| SQLite  | Install-Package Chloe.SQLite  |\n| PostgreSQL  | Install-Package Chloe.PostgreSQL  |\n| 达梦  | Install-Package Chloe.Dameng  |\n| 人大金仓  | Install-Package Chloe.KingbaseES  |\n\n# License\n[MIT](http://opensource.org/licenses/MIT) License\n\n# Usage\n* **Entity**\n```C#\npublic enum Gender\n{\n    Male = 1,\n    Female\n}\n\n[Table(\"Users\")]\npublic class User\n{\n    [Column(IsPrimaryKey = true)]\n    [AutoIncrement]\n    public int Id { get; set; }\n    public string Name { get; set; }\n    public Gender? Gender { get; set; }\n    public int? Age { get; set; }\n    public int? CityId { get; set; }\n    public DateTime? OpTime { get; set; }\n}\n\npublic class City\n{\n    [Column(IsPrimaryKey = true)]\n    public int Id { get; set; }\n    public string Name { get; set; }\n    public int ProvinceId { get; set; }\n}\n\npublic class Province\n{\n    [Column(IsPrimaryKey = true)]\n    public int Id { get; set; }\n    public string Name { get; set; }\n}\n```\n* **DbContext**\n```C#\nIDbContext context = new MsSqlContext(DbHelper.ConnectionString);\nIQuery\u003cUser\u003e q = context.Query\u003cUser\u003e();\n```\n* **Query**\n```C#\nIQuery\u003cUser\u003e q = context.Query\u003cUser\u003e();\nq.Where(a =\u003e a.Id \u003e 0).FirstOrDefault();\nq.Where(a =\u003e a.Id \u003e 0).ToList();\nq.Where(a =\u003e a.Id \u003e 0).OrderBy(a =\u003e a.Age).ToList();\nq.Where(a =\u003e a.Id \u003e 0).Take(10).OrderBy(a =\u003e a.Age).ToList();\n\nq.Where(a =\u003e a.Id \u003e 0).OrderBy(a =\u003e a.Age).ThenByDesc(a =\u003e a.Id).Select(a =\u003e new { a.Id, a.Name }).Skip(20).Take(10).ToList();\n/*\n * SELECT TOP (10) [T].[Id] AS [Id],[T].[Name] AS [Name] FROM (SELECT [Users].[Id] AS [Id],[Users].[Name] AS [Name],ROW_NUMBER() OVER(ORDER BY [Users].[Age] ASC,[Users].[Id] DESC) AS [ROW_NUMBER_0] FROM [Users] AS [Users] WHERE [Users].[Id] \u003e 0) AS [T] WHERE [T].[ROW_NUMBER_0] \u003e 20\n */\n\nq.Where(a =\u003e a.Id \u003e 0).Where(a =\u003e a.Name.Contains(\"lu\")).ToList();\n/*\n * SELECT [Users].[Id] AS [Id],[Users].[Name] AS [Name],[Users].[Gender] AS [Gender],[Users].[Age] AS [Age],[Users].[CityId] AS [CityId],[Users].[OpTime] AS [OpTime] \n * FROM [Users] AS [Users] \n * WHERE ([Users].[Id] \u003e 0 AND [Users].[Name] LIKE '%' + N'lu' + '%')\n */\n```\n* **Join Query**\n```C#\nMsSqlContext context = new MsSqlContext(DbHelper.ConnectionString);\n\nvar user_city_province = context.Query\u003cUser\u003e()\n                         .InnerJoin\u003cCity\u003e((user, city) =\u003e user.CityId == city.Id)\n                         .InnerJoin\u003cProvince\u003e((user, city, province) =\u003e city.ProvinceId == province.Id);\n\nuser_city_province.Select((user, city, province) =\u003e new { UserId = user.Id, CityName = city.Name, ProvinceName = province.Name }).Where(a =\u003e a.UserId == 1).ToList();\n/*\n * SELECT [Users].[Id] AS [UserId],[City].[Name] AS [CityName],[Province].[Name] AS [ProvinceName] \n * FROM [Users] AS [Users] \n * INNER JOIN [City] AS [City] ON [Users].[CityId] = [City].[Id] \n * INNER JOIN [Province] AS [Province] ON [City].[ProvinceId] = [Province].[Id] \n * WHERE [Users].[Id] = 1\n */\n \nvar view = user_city_province.Select((user, city, province) =\u003e new { User = user, City = city, Province = province });\n \nview.Where(a =\u003e a.User.Id == 1).ToList();\n/*\n * SELECT [Users].[Id] AS [Id],[Users].[Name] AS [Name],[Users].[Gender] AS [Gender],[Users].[Age] AS [Age],[Users].[CityId] AS [CityId],[Users].[OpTime] AS [OpTime],[City].[Id] AS [Id0],[City].[Name] AS [Name0],[City].[ProvinceId] AS [ProvinceId],[Province].[Id] AS [Id1],[Province].[Name] AS [Name1] \n * FROM [Users] AS [Users] \n * INNER JOIN [City] AS [City] ON [Users].[CityId] = [City].[Id] \n * INNER JOIN [Province] AS [Province] ON [City].[ProvinceId] = [Province].[Id] \n * WHERE [Users].[Id] = 1\n */\n \nview.Where(a =\u003e a.User.Id == 1).Select(a =\u003e new { UserId = a.User.Id, CityName = a.City.Name, ProvinceName = a.Province.Name }).ToList();\n/*\n * SELECT [Users].[Id] AS [UserId],[City].[Name] AS [CityName],[Province].[Name] AS [ProvinceName] \n * FROM [Users] AS [Users] \n * INNER JOIN [City] AS [City] ON [Users].[CityId] = [City].[Id] \n * INNER JOIN [Province] AS [Province] ON [City].[ProvinceId] = [Province].[Id] \n * WHERE [Users].[Id] = 1\n */\n\n/*\n * Chloe also supports left join,right join and full join query.\n * For details please see 'https://github.com/shuxinqin/Chloe/blob/master/src/Chloe/IQuery%60.cs'.\n */\n```\n* **Group Query**\n```C#\nIQuery\u003cUser\u003e q = context.Query\u003cUser\u003e();\n\nIGroupingQuery\u003cUser\u003e g = q.Where(a =\u003e a.Id \u003e 0).GroupBy(a =\u003e a.Age);\ng = g.Having(a =\u003e a.Age \u003e 1 \u0026\u0026 Sql.Count() \u003e 0);\n\ng.Select(a =\u003e new { a.Age, Count = Sql.Count(), Sum = Sql.Sum(a.Age), Max = Sql.Max(a.Age), Min = Sql.Min(a.Age), Avg = Sql.Average(a.Age) }).ToList();\n/*\n * SELECT [Users].[Age] AS [Age],COUNT(1) AS [Count],SUM([Users].[Age]) AS [Sum],MAX([Users].[Age]) AS [Max],MIN([Users].[Age]) AS [Min],CAST(AVG([Users].[Age]) AS FLOAT) AS [Avg] \n * FROM [Users] AS [Users] \n * WHERE [Users].[Id] \u003e 0 \n * GROUP BY [Users].[Age] HAVING ([Users].[Age] \u003e 1 AND COUNT(1) \u003e 0)\n */\n```\n* **Sql Query**\n```C#\ncontext.SqlQuery\u003cUser\u003e(\"select Id,Name,Age from Users where Name=@name\", DbParam.Create(\"@name\", \"lu\")).ToList();\ncontext.SqlQuery\u003cint\u003e(\"select Id from Users\").ToList();\n```\n* **Aggregate Query**\n```C#\nIQuery\u003cUser\u003e q = context.Query\u003cUser\u003e();\n\nq.Select(a =\u003e Sql.Count()).First();\n/*\n * SELECT TOP (1) COUNT(1) AS [C] FROM [Users] AS [Users]\n */\n\nq.Select(a =\u003e new { Count = Sql.Count(), LongCount = Sql.LongCount(), Sum = Sql.Sum(a.Age), Max = Sql.Max(a.Age), Min = Sql.Min(a.Age), Average = Sql.Average(a.Age) }).First();\n/*\n * SELECT TOP (1) COUNT(1) AS [Count],COUNT_BIG(1) AS [LongCount],SUM([Users].[Age]) AS [Sum],MAX([Users].[Age]) AS [Max],MIN([Users].[Age]) AS [Min],CAST(AVG([Users].[Age]) AS FLOAT) AS [Average] \n * FROM [Users] AS [Users]\n */\n\nvar count = q.Count();\n/*\n * SELECT COUNT(1) AS [C] FROM [Users] AS [Users]\n */\n\nvar longCount = q.LongCount();\n/*\n * SELECT COUNT_BIG(1) AS [C] FROM [Users] AS [Users]\n */\n\nvar sum = q.Sum(a =\u003e a.Age);\n/*\n * SELECT SUM([Users].[Age]) AS [C] FROM [Users] AS [Users]\n */\n\nvar max = q.Max(a =\u003e a.Age);\n/*\n * SELECT MAX([Users].[Age]) AS [C] FROM [Users] AS [Users]\n */\n\nvar min = q.Min(a =\u003e a.Age);\n/*\n * SELECT MIN([Users].[Age]) AS [C] FROM [Users] AS [Users]\n */\n\nvar avg = q.Average(a =\u003e a.Age);\n/*\n * SELECT CAST(AVG([Users].[Age]) AS FLOAT) AS [C] FROM [Users] AS [Users]\n */\n```\n* **Method**\n```C#\nIQuery\u003cUser\u003e q = context.Query\u003cUser\u003e();\n\nvar space = new char[] { ' ' };\n\nDateTime startTime = DateTime.Now;\nDateTime endTime = DateTime.Now.AddDays(1);\nq.Select(a =\u003e new\n{\n    Id = a.Id,\n\n    String_Length = (int?)a.Name.Length,//LEN([Users].[Name])\n    Substring = a.Name.Substring(0),//SUBSTRING([Users].[Name],0 + 1,LEN([Users].[Name]))\n    Substring1 = a.Name.Substring(1),//SUBSTRING([Users].[Name],1 + 1,LEN([Users].[Name]))\n    Substring1_2 = a.Name.Substring(1, 2),//SUBSTRING([Users].[Name],1 + 1,2)\n    ToLower = a.Name.ToLower(),//LOWER([Users].[Name])\n    ToUpper = a.Name.ToUpper(),//UPPER([Users].[Name])\n    IsNullOrEmpty = string.IsNullOrEmpty(a.Name),//too long\n    Contains = (bool?)a.Name.Contains(\"s\"),//\n    Trim = a.Name.Trim(),//RTRIM(LTRIM([Users].[Name]))\n    TrimStart = a.Name.TrimStart(space),//LTRIM([Users].[Name])\n    TrimEnd = a.Name.TrimEnd(space),//RTRIM([Users].[Name])\n    StartsWith = (bool?)a.Name.StartsWith(\"s\"),//\n    EndsWith = (bool?)a.Name.EndsWith(\"s\"),//\n\n    DiffYears = Sql.DiffYears(startTime, endTime),//DATEDIFF(YEAR,@P_0,@P_1)\n    DiffMonths = Sql.DiffMonths(startTime, endTime),//DATEDIFF(MONTH,@P_0,@P_1)\n    DiffDays = Sql.DiffDays(startTime, endTime),//DATEDIFF(DAY,@P_0,@P_1)\n    DiffHours = Sql.DiffHours(startTime, endTime),//DATEDIFF(HOUR,@P_0,@P_1)\n    DiffMinutes = Sql.DiffMinutes(startTime, endTime),//DATEDIFF(MINUTE,@P_0,@P_1)\n    DiffSeconds = Sql.DiffSeconds(startTime, endTime),//DATEDIFF(SECOND,@P_0,@P_1)\n    DiffMilliseconds = Sql.DiffMilliseconds(startTime, endTime),//DATEDIFF(MILLISECOND,@P_0,@P_1)\n    //DiffMicroseconds = Sql.DiffMicroseconds(startTime, endTime),//DATEDIFF(MICROSECOND,@P_0,@P_1)  Exception\n\n    AddYears = startTime.AddYears(1),//DATEADD(YEAR,1,@P_0)\n    AddMonths = startTime.AddMonths(1),//DATEADD(MONTH,1,@P_0)\n    AddDays = startTime.AddDays(1),//DATEADD(DAY,1,@P_0)\n    AddHours = startTime.AddHours(1),//DATEADD(HOUR,1,@P_0)\n    AddMinutes = startTime.AddMinutes(2),//DATEADD(MINUTE,2,@P_0)\n    AddSeconds = startTime.AddSeconds(120),//DATEADD(SECOND,120,@P_0)\n    AddMilliseconds = startTime.AddMilliseconds(20000),//DATEADD(MILLISECOND,20000,@P_0)\n\t\n    Now = DateTime.Now,//GETDATE()\n    UtcNow = DateTime.UtcNow,//GETUTCDATE()\n    Today = DateTime.Today,//CAST(GETDATE() AS DATE)\n    Date = DateTime.Now.Date,//CAST(GETDATE() AS DATE)\n    Year = DateTime.Now.Year,//DATEPART(YEAR,GETDATE())\n    Month = DateTime.Now.Month,//DATEPART(MONTH,GETDATE())\n    Day = DateTime.Now.Day,//DATEPART(DAY,GETDATE())\n    Hour = DateTime.Now.Hour,//DATEPART(HOUR,GETDATE())\n    Minute = DateTime.Now.Minute,//DATEPART(MINUTE,GETDATE())\n    Second = DateTime.Now.Second,//DATEPART(SECOND,GETDATE())\n    Millisecond = DateTime.Now.Millisecond,//DATEPART(MILLISECOND,GETDATE())\n    DayOfWeek = DateTime.Now.DayOfWeek,//(DATEPART(WEEKDAY,GETDATE()) - 1)\n\n    Int_Parse = int.Parse(\"1\"),//CAST(N'1' AS INT)\n    Int16_Parse = Int16.Parse(\"11\"),//CAST(N'11' AS SMALLINT)\n    Long_Parse = long.Parse(\"2\"),//CAST(N'2' AS BIGINT)\n    Double_Parse = double.Parse(\"3\"),//CAST(N'3' AS FLOAT)\n    Float_Parse = float.Parse(\"4\"),//CAST(N'4' AS REAL)\n    //Decimal_Parse = decimal.Parse(\"5\"),//CAST(N'5' AS DECIMAL)  ps: 'Decimal.Parse(string s)' is not supported now,because we don't know the precision and scale information.\n    Guid_Parse = Guid.Parse(\"D544BC4C-739E-4CD3-A3D3-7BF803FCE179\"),//CAST(N'D544BC4C-739E-4CD3-A3D3-7BF803FCE179' AS UNIQUEIDENTIFIER) AS [Guid_Parse]\n\n    Bool_Parse = bool.Parse(\"1\"),//CASE WHEN CAST(N'1' AS BIT) = CAST(1 AS BIT) THEN CAST(1 AS BIT) WHEN NOT (CAST(N'1' AS BIT) = CAST(1 AS BIT)) THEN CAST(0 AS BIT) ELSE NULL END AS [Bool_Parse]\n    DateTime_Parse = DateTime.Parse(\"1949-10-01\"),//CAST(N'1949-10-01' AS DATETIME) AS [DateTime_Parse]\n\n    B = a.Age == null ? false : a.Age \u003e 1,\n}).ToList();\n```\n* **Insert**\n```C#\nIDbContext context = new MsSqlContext(DbHelper.ConnectionString);\n\n//return the key value\nint id = (int)context.Insert\u003cUser\u003e(() =\u003e new User() { Name = \"lu\", Age = 18, Gender = Gender.Male, CityId = 1, OpTime = DateTime.Now });\n/*\n * INSERT INTO [Users]([Name],[Age],[Gender],[CityId],[OpTime]) VALUES(N'lu',18,1,1,GETDATE());SELECT @@IDENTITY\n */\n\n\nUser user = new User();\nuser.Name = \"lu\";\nuser.Age = 18;\nuser.Gender = Gender.Male;\nuser.CityId = 1;\nuser.OpTime = new DateTime(1970, 1, 1);\n\nuser = context.Insert(user);\n/*\n * String @P_0 = \"lu\";\n   Gender @P_1 = Male;\n   Int32 @P_2 = 18;\n   Int32 @P_3 = 1;\n   DateTime @P_4 = \"1970/1/1 0:00:00\";\n   INSERT INTO [Users]([Name],[Gender],[Age],[CityId],[OpTime]) VALUES(@P_0,@P_1,@P_2,@P_3,@P_4);SELECT @@IDENTITY\n */\n```\n* **Update**\n```C#\nMsSqlContext context = new MsSqlContext(DbHelper.ConnectionString);\n\ncontext.Update\u003cUser\u003e(a =\u003e a.Id == 1, a =\u003e new User() { Name = a.Name, Age = a.Age + 1, Gender = Gender.Male, OpTime = DateTime.Now });\n/*\n * UPDATE [Users] SET [Name]=[Users].[Name],[Age]=([Users].[Age] + 1),[Gender]=1,[OpTime]=GETDATE() WHERE [Users].[Id] = 1\n */\n\ncontext.Update\u003cUser\u003e(a =\u003e a.Gender == Gender.Woman, a =\u003e new User() { Age = a.Age - 1, OpTime = DateTime.Now });\n/*\n * UPDATE [Users] SET [Age]=([Users].[Age] - 1),[OpTime]=GETDATE() WHERE [Users].[Gender] = 2\n */\n\n\nUser user = new User();\nuser.Id = 1;\nuser.Name = \"lu\";\nuser.Age = 28;\nuser.Gender = Gender.Male;\nuser.OpTime = DateTime.Now;\n\ncontext.Update(user); //update all columns\n/*\n * String @P_0 = \"lu\";\n   Gender @P_1 = Male;\n   Int32 @P_2 = 28;\n   Nullable\u003cInt32\u003e @P_3 = NULL;\n   DateTime @P_4 = \"2016/7/8 11:28:27\";\n   Int32 @P_5 = 1;\n   UPDATE [Users] SET [Name]=@P_0,[Gender]=@P_1,[Age]=@P_2,[CityId]=@P_3,[OpTime]=@P_4 WHERE [Users].[Id] = @P_5\n */\n\ncontext.TrackEntity(user);//track entity\nuser.Name = user.Name + \"1\";\ncontext.Update(user);//update the column 'Name' only\n/*\n * String @P_0 = \"lu1\";\n   Int32 @P_1 = 1;\n   UPDATE [Users] SET [Name]=@P_0 WHERE [Users].[Id] = @P_1\n */\n```\n* **Delete**\n```C#\nMsSqlContext context = new MsSqlContext(DbHelper.ConnectionString);\n\ncontext.Delete\u003cUser\u003e(a =\u003e a.Id == 1);\n/*\n * DELETE [Users] WHERE [Users].[Id] = 1\n */\n\ncontext.Delete\u003cUser\u003e(a =\u003e a.Gender == null);\n/*\n * DELETE [Users] WHERE [Users].[Gender] IS NULL\n */\n \n \nUser user = new User();\nuser.Id = 1;\ncontext.Delete(user);\n/*\n * Int32 @P_0 = 1;\n   DELETE [Users] WHERE [Users].[Id] = @P_0\n */\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshuxinqin%2FChloe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshuxinqin%2FChloe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshuxinqin%2FChloe/lists"}