From 0c7c073e82bf5bbf65929d71fa1c5cfb3e9f75c8 Mon Sep 17 00:00:00 2001 From: jinghongbo Date: Fri, 11 Jun 2021 10:53:46 +0800 Subject: [PATCH 1/6] Update DamengUtils.cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当 value 等于null 时 string.Concat 返回 "" --- Providers/FreeSql.Provider.Dameng/DamengUtils.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Providers/FreeSql.Provider.Dameng/DamengUtils.cs b/Providers/FreeSql.Provider.Dameng/DamengUtils.cs index cdf77206..930bb5c1 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengUtils.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengUtils.cs @@ -56,7 +56,8 @@ namespace FreeSql.Dameng case DmDbType.Char: case DmDbType.VarChar: case DmDbType.Text: - value = string.Concat(value); + if(value != null) + value = string.Concat(value); break; } } From 50ba957e27569a679a1dbfa9e1c613735eab46ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=95=AC=E6=B4=AA=E6=B3=A2?= Date: Fri, 11 Jun 2021 11:22:45 +0800 Subject: [PATCH 2/6] =?UTF-8?q?string.Concat=20=E8=BF=94=E5=9B=9E=20string?= =?UTF-8?q?.Empty?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FreeSql.Provider.Dameng/DamengUtils.cs | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/Providers/FreeSql.Provider.Dameng/DamengUtils.cs b/Providers/FreeSql.Provider.Dameng/DamengUtils.cs index 930bb5c1..7376f7c4 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengUtils.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengUtils.cs @@ -23,14 +23,21 @@ namespace FreeSql.Dameng { case DmDbType.Bit: if (value == null) value = null; - else value = (bool) value == true ? 1 : 0; + else value = (bool)value == true ? 1 : 0; dbtype = DmDbType.Int32; break; - + case DmDbType.Char: case DmDbType.VarChar: case DmDbType.Text: - value = string.Concat(value); + if (value == null) + { + value = (string)null; + } + else + { + value = string.Concat(value); + } break; } var ret = new DmParameter { ParameterName = QuoteParamterName(parameterName), DmSqlType = dbtype, Value = value }; @@ -56,8 +63,14 @@ namespace FreeSql.Dameng case DmDbType.Char: case DmDbType.VarChar: case DmDbType.Text: - if(value != null) + if (value == null) + { + value = (string)null; + } + else + { value = string.Concat(value); + } break; } } From 6414234d15751754080ac9893f24480f8b6678cd Mon Sep 17 00:00:00 2001 From: luoyunchong Date: Fri, 18 Jun 2021 18:09:52 +0800 Subject: [PATCH 3/6] #802 Add Serializable --- FreeSql/Internal/Model/DynamicFilterInfo.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/FreeSql/Internal/Model/DynamicFilterInfo.cs b/FreeSql/Internal/Model/DynamicFilterInfo.cs index 64adb791..060d772b 100644 --- a/FreeSql/Internal/Model/DynamicFilterInfo.cs +++ b/FreeSql/Internal/Model/DynamicFilterInfo.cs @@ -13,6 +13,7 @@ namespace FreeSql.Internal.Model /// /// 动态过滤条件 /// + [Serializable] public class DynamicFilterInfo { /// From 14e5b41df70f21fc1d1dc7ae3564c7bae674cfb3 Mon Sep 17 00:00:00 2001 From: luoyunchong Date: Sat, 19 Jun 2021 15:38:20 +0800 Subject: [PATCH 4/6] #803 fix IgnoreColumns CanUpdate false not work --- FreeSql.Tests/FreeSql.Tests/Issues/803.cs | 66 +++++++++++++++++++ .../Internal/CommonProvider/UpdateProvider.cs | 3 +- 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 FreeSql.Tests/FreeSql.Tests/Issues/803.cs diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/803.cs b/FreeSql.Tests/FreeSql.Tests/Issues/803.cs new file mode 100644 index 00000000..dc98e8e2 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/Issues/803.cs @@ -0,0 +1,66 @@ +using FreeSql.DataAnnotations; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; +using Xunit; + +namespace FreeSql.Tests.Issues +{ + public class _803 + { + [Table(Name = "crm_sale_order")] + class crm_sale_order + { + [Column(IsPrimary = true, IsIdentity = true)] + public int id { get; set; } + public string name { get; set; } + + public int tag_count { get; set; } + public int gateway_count { get; set; } + + [JsonProperty, Column(DbType = "varchar(30)", CanUpdate = false)] + public string create_by { get; set; } = string.Empty; + + [JsonProperty, Column(DbType = "datetime", CanUpdate = false)] + public DateTime create_time { get; set; } + } + + [Fact] + public void IgnoreColumnsTest() + { + IFreeSql fsql = g.mysql; + var dto = new crm_sale_order + { + name = "name", + create_by = "create_by", + create_time = DateTime.Now + }; + fsql.Insert().AppendData(dto).ExecuteAffrows(); + + var crmDto = fsql.Select().OrderByDescending(r => r.id).First(); + + crmDto.name = "name" + new Random().Next(100); + crmDto.tag_count = new Random().Next(100); + crmDto.gateway_count = new Random().Next(100); + crmDto.create_by = "create_by" + new Random().Next(100); + crmDto.create_time = DateTime.Now.AddMinutes(10); + + fsql.Update().SetSource(crmDto).IgnoreColumns(s => new { s.tag_count, s.gateway_count }).ExecuteAffrows(); + + var updateDto = fsql.Select().OrderByDescending(r => r.id).First(); + + Assert.Equal(updateDto.tag_count, dto.tag_count); + Assert.Equal(updateDto.gateway_count, dto.gateway_count); + Assert.Equal(updateDto.create_time.ToString("g"), dto.create_time.ToString("g")); + Assert.Equal(updateDto.create_by, dto.create_by); + + Assert.Equal(updateDto.name, crmDto.name); + + } + } +} diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index e59bc898..cb64f283 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -351,8 +351,9 @@ namespace FreeSql.Internal.CommonProvider { var cols = columns.Distinct().ToDictionary(a => a); _ignore.Clear(); + IgnoreCanUpdate(); foreach (var col in _table.Columns.Values) - if (cols.ContainsKey(col.Attribute.Name) == true || cols.ContainsKey(col.CsName) == true) + if (!_ignore.ContainsKey(col.Attribute.Name) && (cols.ContainsKey(col.Attribute.Name) == true || cols.ContainsKey(col.CsName) == true)) _ignore.Add(col.Attribute.Name, true); return this; } From b6ae46e911c0c439d686205a33b6bb9300830553 Mon Sep 17 00:00:00 2001 From: luoyunchong Date: Sun, 20 Jun 2021 14:30:08 +0800 Subject: [PATCH 5/6] =?UTF-8?q?#804=20fix=20sqlite=20where=20datetime=20ye?= =?UTF-8?q?ar,month=20=E6=9F=A5=E4=B8=8D=E5=87=BA=E6=9D=A5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE,Ticks=20=E7=B2=BE=E5=BA=A6=E5=88=B0=E6=AF=AB=E7=A7=92?= =?UTF-8?q?=EF=BC=8C=E5=A4=84=E7=90=86Millisecond=E6=97=A0=E5=80=BC?= =?UTF-8?q?=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/Issues/804.cs | 117 ++++++++++++++++++ .../SqliteExpression.cs | 26 ++-- 2 files changed, 130 insertions(+), 13 deletions(-) create mode 100644 FreeSql.Tests/FreeSql.Tests/Issues/804.cs diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/804.cs b/FreeSql.Tests/FreeSql.Tests/Issues/804.cs new file mode 100644 index 00000000..3bab23f5 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/Issues/804.cs @@ -0,0 +1,117 @@ +using FreeSql.DataAnnotations; +using System; +using System.Linq; +using Xunit; + +namespace FreeSql.Tests.Issues +{ + public class _804 + { + [Table(Name = "Users_804")] + class Users + { + [Column(IsPrimary = true, IsIdentity = true)] + public int Id { get; set; } + public string UserName { get; set; } + + public DateTime CreateTime { get; set; } + } + + [Fact] + public void TestYear() + { + var fsql = g.sqlite; + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Insert().AppendData(new Users { UserName = "admn", CreateTime = DateTime.Now }).ExecuteAffrows(); + int year = DateTime.Now.Year; + string strYear = year.ToString(); + //这个都能查到数据 + var d1 = fsql.Select().Where(r => r.CreateTime.Year == Convert.ToInt32(strYear)).ToList(); + /* + SELECT a."Id", a."UserName", a."CreateTime" +FROM "Users_677" a +WHERE (strftime('%Y',a."CreateTime") = cast('2021' as smallint)) + */ + var d2 = fsql.Select().Where(r => r.CreateTime.Year == DateTime.Now.Year).ToList(); + var d3 = fsql.Select().Where(r => r.CreateTime.Year.ToString() == strYear).ToList(); + var d4 = fsql.Select().Where(r => Convert.ToInt32(r.CreateTime.Year) == year).ToList(); + + //只有这种方式在sqlite下无法查到数据 + var d5 = fsql.Select().Where(r => r.CreateTime.Year == year).ToList(); + /* +SELECT a."Id", a."UserName", a."CreateTime" +FROM "Users_677" a +WHERE (strftime('%Y',a."CreateTime") = 2021) + + */ + Assert.Single(d1); + Assert.Single(d2); + Assert.Single(d3); + Assert.Single(d4); + Assert.Single(d5); + + } + + + [Fact] + public void TestMonthAndData() + { + var fsql = g.sqlite; + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Insert().AppendData(new Users { UserName = "admin", CreateTime = DateTime.Now }).ExecuteAffrows(); + + var year = DateTime.Now.Year; + var month = DateTime.Now.Month; + + var d3 = fsql.Select().ToList(r => new + { + r.CreateTime, + r.CreateTime.Date, + r.CreateTime.TimeOfDay, + r.CreateTime.DayOfWeek, + r.CreateTime.Day, + r.CreateTime.DayOfYear, + r.CreateTime.Month, + r.CreateTime.Year, + r.CreateTime.Hour, + r.CreateTime.Minute, + r.CreateTime.Second, + r.CreateTime.Millisecond, + r.CreateTime.Ticks, + }); + + Assert.Single(d3); + + var d3_first = d3.First(); + + Assert.Equal(d3_first.Date, d3_first.CreateTime.Date); + //精度到毫秒 + Assert.Equal((long)(d3_first.TimeOfDay.TotalMilliseconds + 0.5), (long)(d3_first.CreateTime.TimeOfDay.TotalMilliseconds + 0.5)); + Assert.Equal(d3_first.DayOfWeek, d3_first.CreateTime.DayOfWeek); + Assert.Equal(d3_first.Day, d3_first.CreateTime.Day); + Assert.Equal(d3_first.DayOfYear, d3_first.CreateTime.DayOfYear); + Assert.Equal(d3_first.Month, d3_first.CreateTime.Month); + Assert.Equal(d3_first.Year, d3_first.CreateTime.Year); + Assert.Equal(d3_first.Hour, d3_first.CreateTime.Hour); + Assert.Equal(d3_first.Minute, d3_first.CreateTime.Minute); + Assert.Equal(d3_first.Second, d3_first.CreateTime.Second); + Assert.Equal(d3_first.Millisecond, d3_first.CreateTime.Millisecond); + //精度到毫秒 ,四舍五入 + Assert.Equal((long)(d3_first.Ticks / 10000.0 + 0.5), (long)(d3_first.CreateTime.Ticks / 10000.0 + 0.5)); + + + string strMonth = month.ToString(); + var dmonth1 = fsql.Select().Where(r => r.CreateTime.Month.ToString() == strMonth).ToList(); + + + var d1 = fsql.Select().Where(r => r.CreateTime.Month == month).ToList(); + var d2 = fsql.Select().Where(r => r.CreateTime.Year == year).ToList(); + var d5 = fsql.Select().Where(r => r.CreateTime.Year == 2021).ToList(); + + Assert.Single(dmonth1); + Assert.Single(d1); + Assert.Single(d1); + Assert.Single(d5); + } + } +} diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs index eebdb488..8f3c1710 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs @@ -1,10 +1,10 @@ -using System; +using FreeSql.Internal; +using System; using System.Collections; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Text.RegularExpressions; -using FreeSql.Internal; namespace FreeSql.Sqlite { @@ -201,17 +201,17 @@ namespace FreeSql.Sqlite switch (exp.Member.Name) { case "Date": return $"date({left})"; - case "TimeOfDay": return $"strftime('%s',{left})"; - case "DayOfWeek": return $"strftime('%w',{left})"; - case "Day": return $"strftime('%d',{left})"; - case "DayOfYear": return $"strftime('%j',{left})"; - case "Month": return $"strftime('%m',{left})"; - case "Year": return $"strftime('%Y',{left})"; - case "Hour": return $"strftime('%H',{left})"; - case "Minute": return $"strftime('%M',{left})"; - case "Second": return $"strftime('%S',{left})"; - case "Millisecond": return $"(strftime('%f',{left})-strftime('%S',{left}))"; - case "Ticks": return $"(strftime('%s',{left})*10000000+621355968000000000)"; + case "TimeOfDay": return $"strftime('%H:%M:%f',{left})"; + case "DayOfWeek": return $"CAST(strftime('%w',{left}) AS INTEGER) "; + case "Day": return $"CAST(strftime('%d',{left}) AS INTEGER) "; + case "DayOfYear": return $"CAST(strftime('%j',{left}) AS INTEGER) "; + case "Month": return $"CAST(strftime('%m',{left}) AS INTEGER) "; + case "Year": return $"CAST(strftime('%Y',{left}) AS INTEGER) "; + case "Hour": return $"CAST(strftime('%H',{left}) AS INTEGER) "; + case "Minute": return $"CAST(strftime('%M',{left}) AS INTEGER) "; + case "Second": return $"CAST(strftime('%S',{left}) AS INTEGER) "; + case "Millisecond": return $"CAST(strftime('%f',{left})*1000.0%1000.0 AS INTEGER)"; + case "Ticks": return $"CAST(((strftime( '%J',{left}) - 1721425.5 ) * {TimeSpan.TicksPerDay} ) AS INTEGER ) ";//精度到毫秒 } return null; } From 7af0707f7a709da631befc32e412fe1c99a21654 Mon Sep 17 00:00:00 2001 From: IGeekFan Date: Mon, 21 Jun 2021 22:38:57 +0800 Subject: [PATCH 6/6] =?UTF-8?q?fix=20docfx=20=E9=83=A8=E7=BD=B2=E6=97=A0?= =?UTF-8?q?=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docfx.yml | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/.github/workflows/docfx.yml b/.github/workflows/docfx.yml index 9ecb6663..0ff00767 100644 --- a/.github/workflows/docfx.yml +++ b/.github/workflows/docfx.yml @@ -3,48 +3,30 @@ name: .NET Core Deploy Docfx on: push: branches: [master] - pull_request: - branches: [master] jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Setup .NET Core - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 5.0.202 - - name: Exclude example projects - run: dotnet sln FreeSql.sln remove Examples/**/*.csproj FreeSql.Tests/**/*.csproj - - name: Install dependencies - run: dotnet restore - - name: Build solution - run: dotnet build --configuration Release --no-restore - generate-docs: runs-on: windows-latest - needs: build steps: - name: Checkout uses: actions/checkout@v2 - name: Setup .NET Core uses: actions/setup-dotnet@v1 - with: - dotnet-version: 5.0.202 + with: + dotnet-version: 5.0.x - name: Remove Examples run: dotnet sln FreeSql.sln remove (ls -r Examples/**/*.csproj) - name: Remove FreeSql.Tests run: dotnet sln FreeSql.sln remove (ls -r FreeSql.Tests/**/*.csproj) - name: Install dependencies run: dotnet restore + - name: Build solution + run: dotnet build --configuration Release --no-restore - name: Setup DocFX uses: crazy-max/ghaction-chocolatey@v1 with: - args: install docfx --version 2.56.7 + args: install docfx - name: DocFX Build working-directory: docs run: docfx docfx.json