diff --git a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs index beda3238..af1f4aff 100644 --- a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs @@ -85,7 +85,9 @@ namespace FreeSql.Tests.MySql { [Fact] public void Lazy() { - var tags = g.mysql.Select().Where(a => a.Parent.Name == "xxx").LeftJoin(a => a.Parent_id == a.Parent.Id).ToList(); + var tags = g.mysql.Select().Where(a => a.Parent.Name == "xxx") + .LeftJoin(a => a.Parent_id == a.Parent.Id) + .ToSql(); var songs = g.mysql.Select().Limit(10).ToList(); diff --git a/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/UnitTest1.cs index 1fc120eb..61ec8c1a 100644 --- a/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/UnitTest1.cs @@ -11,6 +11,22 @@ using Npgsql.LegacyPostgis; namespace FreeSql.Tests { public class UnitTest1 { + public class Order { + [Column(IsPrimary = true)] + public int OrderID { get; set; } + public string OrderTitle { get; set; } + public string CustomerName { get; set; } + public DateTime TransactionDate { get; set; } + public virtual List OrderDetails { get; set; } + } + public class OrderDetail { + [Column(IsPrimary = true)] + public int DetailId { get; set; } + + public int OrderId { get; set; } + public virtual Order Order { get; set; } + } + class NullAggreTestTable { [Column(IsIdentity = true)] public int Id { get; set; } @@ -20,6 +36,14 @@ namespace FreeSql.Tests { [Fact] public void Test1() { + var order = g.mysql.Select().Where(a => a.OrderID == 1).ToOne(); //查询订单表 + var orderDetail1 = order.OrderDetails; //第一次访问,查询数据库 + var orderDetail2 = order.OrderDetails; //第二次访问,不查 + var order1 = orderDetail1.FirstOrDefault(); //访问导航属性,此时不查数据库,因为 OrderDetails 查询出来的时候已填充了该属性 + + + var queryable = g.mysql.Queryable().Where(a => a.Id == 1).ToList(); + var sql2222 = select.Where(a => select.Where(b => b.Id == a.Id && select.Where(c => c.Id == b.Id).Where(d => d.Id == a.Id).Where(e => e.Id == b.Id) diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 39f75ddb..1f8ae9a1 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -10,6 +10,8 @@ using System.Reflection; public static class FreeSqlGlobalExtensions { + public static FreeSql.ISelect Queryable(this IFreeSql freesql) where T : class => freesql.Select(); + static Lazy> dicIsNumberType = new Lazy>(() => new Dictionary { [typeof(sbyte)] = true, [typeof(short)] = true, diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 7464c2c7..fcf852c2 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -283,8 +283,15 @@ namespace FreeSql.Internal.CommonProvider { if (dicfield.ContainsKey(quoteName)) field.Append(" as").Append(index); else dicfield.Add(quoteName, true); } else { - var tb2 = _tables.Where((a, b) => b > 0 && a.Table.Type == prop.PropertyType && a.Alias.Contains(prop.Name)).FirstOrDefault(); //鍒ゆ柇 b > 0 闃叉 parent 閫掑綊鍏崇郴 - if (tb2 == null && props.Where(pw => pw.Value.PropertyType == prop.PropertyType).Count() == 1) tb2 = _tables.Where((a, b) => b > 0 && a.Table.Type == prop.PropertyType).FirstOrDefault(); + var tb2 = _tables.Where((a, b) => b > 0 && + (a.Type == SelectTableInfoType.InnerJoin || a.Type == SelectTableInfoType.LeftJoin || a.Type == SelectTableInfoType.RightJoin) && + string.IsNullOrEmpty(a.On) == false && + a.Alias.Contains(prop.Name)).FirstOrDefault(); //鍒ゆ柇 b > 0 闃叉 parent 閫掑綊鍏崇郴 + if (tb2 == null && props.Where(pw => pw.Value.PropertyType == prop.PropertyType).Count() == 1) + tb2 = _tables.Where((a, b) => b > 0 && + (a.Type == SelectTableInfoType.InnerJoin || a.Type == SelectTableInfoType.LeftJoin || a.Type == SelectTableInfoType.RightJoin) && + string.IsNullOrEmpty(a.On) == false && + a.Table.Type == prop.PropertyType).FirstOrDefault(); if (tb2 == null) continue; foreach (var col2 in tb2.Table.Columns.Values) { if (index > 0) field.Append(", "); diff --git a/readme.md b/readme.md index 191c38ca..b2a5dcfb 100644 --- a/readme.md +++ b/readme.md @@ -1,19 +1,24 @@ # FreeSql -FreeSql 鏄交閲忓寲銆佸彲鎵╁睍鍜岃法骞冲彴鐗堢殑 .NETStandard 鏁版嵁璁块棶鎶鏈疄鐜般 +FreeSql鏄竴涓姛鑳藉己澶х殑NETStandard搴擄紝鐢ㄤ簬瀵硅薄鍏崇郴鏄犲皠绋嬪簭(O/RM)锛屼互渚夸簬寮鍙戜汉鍛樿兘澶熶娇鐢 .NETStandard 瀵硅薄鏉ュ鐞嗘暟鎹簱锛屼笉蹇呯粡甯哥紪鍐欏ぇ閮ㄥ垎鏁版嵁璁块棶浠g爜銆 -FreeSql 鍙敤浣滃璞″叧绯绘槧灏勭▼搴 (O/RM)锛屼互渚夸簬寮鍙戜汉鍛樿兘澶熶娇鐢 .NETStandard 瀵硅薄鏉ュ鐞嗘暟鎹簱锛屼笉蹇呯粡甯哥紪鍐欏ぇ閮ㄥ垎鏁版嵁璁块棶浠g爜銆 +## 鐗规 -FreeSql 鏀寔 MySql/SqlServer/PostgreSQL/Oracle/Sqlite 鏁版嵁搴撴妧鏈疄鐜般 +- [x] CodeFirst 杩佺Щ銆 +- [x] DbFirst 浠庢暟鎹簱瀵煎叆瀹炰綋绫伙紝鏀寔涓夌妯℃澘鐢熸垚鍣ㄣ +- [x] 閲囩敤 ExpressionTree 楂樻ц兘璇诲彇鏁版嵁銆 +- [x] 绫诲瀷鏄犲皠娣卞叆鏀寔锛屾瘮濡俻gsql鐨勬暟缁勭被鍨嬶紝鍫О鍖犲績鍒朵綔銆 +- [x] 鏀寔涓板瘜鐨勮〃杈惧紡鍑芥暟銆 +- [x] 鏀寔瀵艰埅灞炴ф煡璇紝鍜屽欢鏃跺姞杞姐 +- [x] 鏀寔鍚屾/寮傛鏁版嵁搴撴搷浣滄柟娉曪紝涓板瘜澶氬僵鐨勯摼寮忔煡璇㈡柟娉曘 +- [x] 鏀寔浜嬪姟銆 +- [x] 鏀寔澶氱鏁版嵁搴擄紝MySql/SqlServer/PostgreSQL/Oracle/Sqlite銆 -FreeSql 鎵撻 .NETCore 鏈鏂逛究鐨 ORM锛宒bfirst codefirst娣峰悎浣跨敤锛宑odefirst妯″紡涓嬬殑寮鍙戦樁娈碉紝寤哄ソ瀹炰綋涓嶇敤鎵ц浠讳綍鎿嶄綔鍗宠兘鍒涘缓琛ㄥ拰淇敼瀛楁锛宒bfirst妯″紡涓嬫彁渚沘pi+妯℃澘鑷畾涔夌敓鎴愪唬鐮侊紝浣滆呮彁渚涗簡3绉嶆ā鏉,鎮ㄥ彲浠ユ寔缁叧娉ㄦ垨鑰呭弬涓庣粰鍑哄疂璐垫剰瑙侊紝QQ缇わ細4336577銆 +[銆奡elect鏌ヨ鏁版嵁鏂囨。銆媇(https://github.com/2881099/FreeSql/wiki/%e6%9f%a5%e8%af%a2) | [銆奤pdate鏇存柊鏁版嵁鏂囨。銆媇(https://github.com/2881099/FreeSql/wiki/%e4%bf%ae%e6%94%b9) | [銆奍nsert鎻掑叆鏁版嵁鏂囨。銆媇(https://github.com/2881099/FreeSql/wiki/%e6%b7%bb%e5%8a%a0) | [銆奃elete鍒犻櫎鏁版嵁鏂囨。銆媇(https://github.com/2881099/FreeSql/wiki/%e5%88%a0%e9%99%a4) +[銆奅xpression 琛ㄨ揪寮忓嚱鏁版枃妗c媇(https://github.com/2881099/FreeSql/wiki/%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0) | [銆奀odeFirst 蹇熷紑鍙戞枃妗c媇(https://github.com/2881099/FreeSql/wiki/CodeFirst) | [銆奃bFirst 蹇熷紑鍙戞枃妗c媇(https://github.com/2881099/FreeSql/wiki/DbFirst) -[銆奡elect鏌ヨ鏁版嵁鏂囨。銆媇(Docs/select.md) | [銆奤pdate鏇存柊鏁版嵁鏂囨。銆媇(Docs/update.md) | [銆奍nsert鎻掑叆鏁版嵁鏂囨。銆媇(Docs/insert.md) | [銆奃elete鍒犻櫎鏁版嵁鏂囨。銆媇(Docs/delete.md) - -[銆奅xpression 琛ㄨ揪寮忓嚱鏁版枃妗c媇(Docs/expression.md) | [銆奀odeFirst 蹇熷紑鍙戞枃妗c媇(Docs/codefirst.md) | [銆奃bFirst 蹇熷紑鍙戞枃妗c媇(Docs/dbfirst.md) - -# 蹇熷紑濮 +## 蹇熷紑濮 ```csharp var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10"; @@ -158,7 +163,7 @@ List t6 = fsql.Ado.Query("select * from song"); List<(int, string ,string)> t7 = fsql.Ado.Query<(int, string, string)>("select * from song"); List t8 = fsql.Ado.Query("select * from song"); ``` -> 鏇村璧勬枡锛歔銆奡elect鏌ヨ鏁版嵁銆媇(Docs/select.md) +> 鏇村璧勬枡锛歔銆奡elect鏌ヨ鏁版嵁銆媇(https://github.com/2881099/FreeSql/wiki/%e6%9f%a5%e8%af%a2) ## 鎬ц兘娴嬭瘯 @@ -221,7 +226,7 @@ var t6 = fsql.Insert().AppendData(items) | ExecuteAffrows | long | 鎵цSQL璇彞锛岃繑鍥炲奖鍝嶇殑琛屾暟 | | ExecuteIdentity | long | 鎵цSQL璇彞锛岃繑鍥炶嚜澧炲 | | ExecuteInserted | List\ | 鎵цSQL璇彞锛岃繑鍥炴彃鍏ュ悗鐨勮褰 | -> 鏇村璧勬枡锛歔銆奍nsert娣诲姞鏁版嵁銆媇(Docs/select.md) +> 鏇村璧勬枡锛歔銆奍nsert娣诲姞鏁版嵁銆媇(https://github.com/2881099/FreeSql/wiki/%e6%b7%bb%e5%8a%a0) # Part3 淇敼 ```csharp @@ -298,13 +303,13 @@ var t10 = fsql.Update().SetRaw("Title = {0}", "鏂版爣棰").Where("Id = {0 | - | - | - | - | | ExecuteAffrows | long | | 鎵цSQL璇彞锛岃繑鍥炲奖鍝嶇殑琛屾暟 | | ExecuteUpdated | List\ | | 鎵цSQL璇彞锛岃繑鍥炴洿鏂板悗鐨勮褰 | -> 鏇村璧勬枡锛歔銆奤pdate鏇存柊鏁版嵁銆媇(Docs/select.md) +> 鏇村璧勬枡锛歔銆奤pdate鏇存柊鏁版嵁銆媇(https://github.com/2881099/FreeSql/wiki/%e4%bf%ae%e6%94%b9) # Part4 鍒犻櫎 -璇︽儏鏌ョ湅锛歔銆奃elete 鍒犻櫎鏁版嵁銆媇(Docs/delete.md) +璇︽儏鏌ョ湅锛歔銆奃elete 鍒犻櫎鏁版嵁銆媇(https://github.com/2881099/FreeSql/wiki/%e5%88%a0%e9%99%a4) # Part5 琛ㄨ揪寮忓嚱鏁 -璇︽儏鏌ョ湅锛歔銆奅xpression 琛ㄨ揪寮忓嚱鏁般媇(Docs/expression.md) +璇︽儏鏌ョ湅锛歔銆奅xpression 琛ㄨ揪寮忓嚱鏁般媇(https://github.com/2881099/FreeSql/wiki/%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0) # Part6 浜嬪姟