Skip to content

Commit a708062

Browse files
2881028810
authored andcommitted
- 修复 IUpdate.Set 表达式解析的 bug;
1 parent 4ade1c8 commit a708062

File tree

14 files changed

+61
-41
lines changed

14 files changed

+61
-41
lines changed

Examples/orm_vs/Program.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ namespace orm_vs
1515
class Program
1616
{
1717
static IFreeSql fsql = new FreeSql.FreeSqlBuilder()
18-
.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=20")
19-
//.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")
18+
//.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=20")
19+
.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")
2020
.UseAutoSyncStructure(false)
2121
.UseNoneCommandParameter(true)
2222
//.UseConfigEntityFromDbFirst(true)
@@ -25,10 +25,10 @@ class Program
2525
static SqlSugarClient sugar {
2626
get => new SqlSugarClient(new ConnectionConfig() {
2727
//不欺负,让连接池100个最小
28-
ConnectionString = "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Min Pool Size=20;Max Pool Size=20",
29-
DbType = DbType.SqlServer,
30-
//ConnectionString = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Min Pool Size=20;Max Pool Size=20",
31-
//DbType = DbType.MySql,
28+
//ConnectionString = "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Min Pool Size=20;Max Pool Size=20",
29+
//DbType = DbType.SqlServer,
30+
ConnectionString = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Min Pool Size=20;Max Pool Size=20",
31+
DbType = DbType.MySql,
3232
IsAutoCloseConnection = true,
3333
InitKeyType = InitKeyType.Attribute
3434
});
@@ -37,8 +37,8 @@ static SqlSugarClient sugar {
3737
class SongContext : DbContext {
3838
public DbSet<Song> Songs { get; set; }
3939
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
40-
optionsBuilder.UseSqlServer(@"Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Min Pool Size=21;Max Pool Size=21");
41-
//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");
40+
//optionsBuilder.UseSqlServer(@"Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Min Pool Size=21;Max Pool Size=21");
41+
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");
4242
}
4343
}
4444

@@ -48,6 +48,9 @@ static void Main(string[] args) {
4848
//sugar.CodeFirst.InitTables(typeof(Song), typeof(Song_tag), typeof(Tag));
4949
//sugar创建表失败:SqlSugar.SqlSugarException: Sequence contains no elements
5050

51+
sugar.Aop.OnLogExecuted = (s, e) => {
52+
Trace.WriteLine(s);
53+
};
5154
//测试前清空数据
5255
fsql.Delete<Song>().Where(a => a.Id > 0).ExecuteAffrows();
5356
sugar.Deleteable<Song>().Where(a => a.Id > 0).ExecuteCommand();

Examples/orm_vs/orm_vs.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
<ItemGroup>
1515
<ProjectReference Include="..\..\FreeSql\FreeSql.csproj" />
16+
<ProjectReference Include="..\..\Providers\FreeSql.Provider.MySql\FreeSql.Provider.MySql.csproj" />
17+
<ProjectReference Include="..\..\Providers\FreeSql.Provider.SqlServer\FreeSql.Provider.SqlServer.csproj" />
1618
</ItemGroup>
1719

1820
<ItemGroup>

Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
5-
<Version>0.6.12</Version>
5+
<Version>0.6.13</Version>
66
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
77
<Authors>YeXiangQin</Authors>
88
<Description>FreeSql 扩展包,可实现【延时加载】属性.</Description>

FreeSql.Tests/UnitTest1.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ public class TaskBuild {
253253
public bool OptionsEntity01 { get; set; } = false;
254254
public bool OptionsEntity02 { get; set; } = false;
255255
public bool OptionsEntity03 { get; set; } = false;
256-
public bool OptionsEntity04 { get; set; } = false;
256+
public int OptionsEntity04 { get; set; }
257257

258258
[Navigate("TbId")]
259259
public virtual ICollection<TaskBuildInfo> Builds { get; set; }
@@ -292,10 +292,14 @@ public void Test1() {
292292

293293

294294
var tbid = g.sqlite.Select<TaskBuild>().First().Id;
295+
296+
var testarray = new[] { 1, 2, 3 };
295297
var tbidsql = g.sqlite.Update<TaskBuild>().Where(a => a.Id == tbid)
296298
.Set(a => new TaskBuild {
297299
FileName = "111",
298-
TaskName = a.TaskName + "333"
300+
TaskName = a.TaskName + "333",
301+
OptionsEntity02 = false,
302+
OptionsEntity04 = testarray[0]
299303
}).ToSql();
300304

301305

FreeSql.sln

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.LazyLoad
4242
EndProject
4343
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.MySqlConnector", "Providers\FreeSql.Provider.MySqlConnector\FreeSql.Provider.MySqlConnector.csproj", "{D2A41321-5E84-410B-B25C-3AA122D4CA27}"
4444
EndProject
45-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSql.Tests.Provider.MySqlConnector", "FreeSql.Tests.Provider.MySqlConnector\FreeSql.Tests.Provider.MySqlConnector.csproj", "{D113CDFB-FB97-482B-8A00-058E715B624A}"
45+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.MySqlConnector", "FreeSql.Tests.Provider.MySqlConnector\FreeSql.Tests.Provider.MySqlConnector.csproj", "{D113CDFB-FB97-482B-8A00-058E715B624A}"
4646
EndProject
4747
Global
4848
GlobalSection(SolutionConfigurationPlatforms) = preSolution

FreeSql/FreeSql.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
5-
<Version>0.6.12</Version>
5+
<Version>0.6.13</Version>
66
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
77
<Authors>YeXiangQin</Authors>
88
<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>

FreeSql/Internal/CommonExpression.cs

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -278,40 +278,51 @@ public string[] ExpressionSelectColumns_MemberAccess_New_NewArrayInit(List<Selec
278278
};
279279
public string ExpressionWhereLambdaNoneForeignObject(List<SelectTableInfo> _tables, TableInfo table, List<SelectColumnInfo> _selectColumnMap, Expression exp, Func<Expression[], string> getSelectGroupingMapString) {
280280
var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, _selectColumnMap = _selectColumnMap, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = table });
281-
if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool) && sql.Contains(" IS ") == false && sql.Contains(" = ") == false)
281+
var isBool = exp.Type.NullableTypeOrThis() == typeof(bool);
282+
if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false)
282283
return $"{sql} = {formatSql(true, null)}";
283-
switch (sql) {
284-
case "1":
285-
case "'t'": return "1=1";
286-
case "0":
287-
case "'f'": return "1=2";
288-
default:return sql;
284+
if (isBool) {
285+
switch (sql) {
286+
case "1":
287+
case "'t'": return "1=1";
288+
case "0":
289+
case "'f'": return "1=2";
290+
default: return sql;
291+
}
289292
}
293+
return sql;
290294
}
291295

292296
public string ExpressionWhereLambda(List<SelectTableInfo> _tables, Expression exp, Func<Expression[], string> getSelectGroupingMapString) {
293297
var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where });
294-
if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool) && sql.Contains(" IS ") == false && sql.Contains(" = ") == false)
298+
var isBool = exp.Type.NullableTypeOrThis() == typeof(bool);
299+
if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false)
295300
return $"{sql} = {formatSql(true, null)}";
296-
switch (sql) {
297-
case "1":
298-
case "'t'": return "1=1";
299-
case "0":
300-
case "'f'": return "1=2";
301-
default: return sql;
301+
if (isBool) {
302+
switch (sql) {
303+
case "1":
304+
case "'t'": return "1=1";
305+
case "0":
306+
case "'f'": return "1=2";
307+
default: return sql;
308+
}
302309
}
310+
return sql;
303311
}
304312
public void ExpressionJoinLambda(List<SelectTableInfo> _tables, SelectTableInfoType tbtype, Expression exp, Func<Expression[], string> getSelectGroupingMapString) {
305313
var tbidx = _tables.Count;
306314
var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = tbtype, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where });
307-
if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool) && sql.Contains(" IS ") == false && sql.Contains(" = ") == false)
315+
var isBool = exp.Type.NullableTypeOrThis() == typeof(bool);
316+
if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false)
308317
sql = $"{sql} = {formatSql(true, null)}";
309-
switch (sql) {
310-
case "1":
311-
case "'t'": sql = "1=1"; break;
312-
case "0":
313-
case "'f'": sql = "1=2"; break;
314-
default: break;
318+
if (isBool) {
319+
switch (sql) {
320+
case "1":
321+
case "'t'": sql = "1=1"; break;
322+
case "0":
323+
case "'f'": sql = "1=2"; break;
324+
default: break;
325+
}
315326
}
316327
if (_tables.Count > tbidx) {
317328
_tables[tbidx].Type = tbtype;

FreeSql/Internal/CommonProvider/UpdateProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ public IUpdate<T1> Set<TMember>(Expression<Func<T1, TMember>> exp) {
358358
var memberName = initExp.Bindings[a].Member.Name;
359359
if (_table.ColumnsByCsIgnore.ContainsKey(memberName)) continue;
360360
if (_table.ColumnsByCs.TryGetValue(memberName, out var col) == false) throw new Exception($"找不到属性:{memberName}");
361-
var memberValue = _commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, initAssignExp.Expression, null);
361+
var memberValue = _commonExpression.ExpressionLambdaToSql(initAssignExp.Expression, new CommonExpression.ExpTSC { });
362362
_setIncr.Append(", ").Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = ").Append(memberValue);
363363
}
364364
}

Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFrameworks>netstandard2.0;net452</TargetFrameworks>
5-
<Version>0.6.12</Version>
5+
<Version>0.6.13</Version>
66
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
77
<Authors>YeXiangQin</Authors>
88
<Description>FreeSql 数据库实现,基于 MySql 5.6</Description>

Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
5-
<Version>0.6.12</Version>
5+
<Version>0.6.13</Version>
66
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
77
<Authors>YeXiangQin</Authors>
88
<Description>FreeSql 数据库实现,基于 MySql 5.6</Description>

0 commit comments

Comments
 (0)