From e03aaed55b8d1645169902f5e399758dfc2ccab8 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Thu, 19 Dec 2019 10:51:21 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20LazyLoading=20?= =?UTF-8?q?=E5=9C=A8=20Net4=20=E7=8E=AF=E5=A2=83=E4=B8=8B=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Entities/Class1.cs | 1 + Examples/base_entity/Entities/User.cs | 2 +- Examples/base_entity/Program.cs | 3 ++ Examples/base_entity/base_entity.csproj | 1 + Examples/orm_vs_net40/Program.cs | 7 --- .../BaseEntity 纯净版源码(.Net 4.0).zip | Bin 2698 -> 2698 bytes .../LazyLoadingComplier.cs | 41 ++++++++++++++---- FreeSql/Internal/UtilsExpressionTree.cs | 12 +++-- 8 files changed, 47 insertions(+), 20 deletions(-) create mode 100644 Examples/base_entity/Entities/Class1.cs diff --git a/Examples/base_entity/Entities/Class1.cs b/Examples/base_entity/Entities/Class1.cs new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/Examples/base_entity/Entities/Class1.cs @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Examples/base_entity/Entities/User.cs b/Examples/base_entity/Entities/User.cs index 7e7d741f..3b8270ec 100644 --- a/Examples/base_entity/Entities/User.cs +++ b/Examples/base_entity/Entities/User.cs @@ -31,7 +31,7 @@ public class User1 : BaseEntity public int GroupId { get; set; } public UserGroup Group { get; set; } - public List Roles { get; set; } + public virtual List Roles { get; set; } /// /// 登陆名 diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 6f43a2e8..146f9603 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -44,10 +44,13 @@ namespace base_entity .UseConnectionString(FreeSql.DataType.Sqlite, "data source=test.db;max pool size=5") //.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=2") .UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=3") + .UseLazyLoading(true) .Build(); BaseEntity.Initialization(fsql); #endregion + var us = User1.Select.Limit(10).ToList(); + new Products { title = "product-1" }.Save(); new Products { title = "product-2" }.Save(); new Products { title = "product-3" }.Save(); diff --git a/Examples/base_entity/base_entity.csproj b/Examples/base_entity/base_entity.csproj index 7289cf02..c912bae3 100644 --- a/Examples/base_entity/base_entity.csproj +++ b/Examples/base_entity/base_entity.csproj @@ -17,6 +17,7 @@ + diff --git a/Examples/orm_vs_net40/Program.cs b/Examples/orm_vs_net40/Program.cs index e3f572cb..66cd43ef 100644 --- a/Examples/orm_vs_net40/Program.cs +++ b/Examples/orm_vs_net40/Program.cs @@ -35,13 +35,6 @@ namespace orm_vs static void Main(string[] args) { - var testlist1 = fsql.Select().OrderBy(a => a.Id).ToList(); - var testlist2 = new List(); - fsql.Select().OrderBy(a => a.Id).ToChunk(0, list => - { - testlist2.AddRange(list); - }); - 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 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity 纯净版源码(.Net 4.0).zip b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity 纯净版源码(.Net 4.0).zip index 11ac08713d39e5fa8d6f14da479b098d1c22ad90..6a90cb183bbb7a74c0e98cbb524ad08de5b0618b 100644 GIT binary patch delta 759 zcmV)W;w zsSwLfykK+iKuC)@8V3=H6LKk_Jci8VV@f*F$6VhbOx}JGbT2%R^O%QsR6sOsKK zA(E#Hf`5VZkQ%xHL|xD((Yjyresv^Y28G(>ky4S2jB?~itf^p|C+75zwl%W!0=b+* zgC*pr-YyV>)JyolYw+(?qGU4Kwq*n`H-bO5UN3pLVrn>wS}7_Ze2IfB9#vFFbC1jGMSW^ zyb8sypr%rnBWRoo4O*)@5ymS6V5$OBDMvH%!koG%w4rmivJIqyeOu_pZ+ap_yrNu- z5RLhUE%hYZ98TGvyL~ES`xf1A_aD!Edi&$^rJeG=)Umv?u{mBw1+;9b0qf0c)6GlA zgMaDIt#i*+!=V^^S)e1UddwViFtw$FwdE^UE?c^4)w;<^)AAh6$asf#_B`ZpO)J>g zDV1^SaijJ1Yw-C>)b9Mnt5=zkyt&qF^j)jHJ%mco>lF$JbO{?8#ce7kxtQ%elIm@l zAwwwD=lu@v;rfSew>-B@WuK@Oq%73D`G0oy+Qa7cbCK`=laP&9bQv2It2=~#Cx`%( zAV`YL51^S(SA!Fc%&$u32@p!48JA~yJE?h`3XgTvrDP2ql`UTmarnu6qQBoh6Lr%MZN?wWDe@TU~sn3+DpOdZ$ pYYjkFlTXfj`iz1F003;0CJHtV2*4)*7q-;_2*4)*7q*jX3LuT3da3{b delta 759 zcmVcG2#1pokRvk(OE0)Gam-#Ys|xX_q+|FJoJW#;|! z;PlDaH;>SW5ZJ2b`h_V2BY8dhQ(ZxgKe`gKQxmVWUn*_Gd~hz(3etfBY|A6pw{0U* zA(ovu!RFwAkQQ?^4k8jCb-(8Q>PWr}3bn~2r6L&_<;am(Q^7V*%;_I(Yh>jGayfnczFAsOs8;Uvg;Jhb`6su|vz4 zPgWc``Gp*L97nw}37ry}CsSs9U8QBLhOyR!ihn9g3pYpHx^AFFDjnuw4x*h^GN~|m z6^dU$O{FeJ&^Q$uv{rQ@j8_K0R0XC|j%MVAIdxBHL+5T~8%PEFw$P2=^hAbuMY$Fs z8uJZX>PfaaoU%W6`&7p6ExO+BKc4yY_Q&T-JLPq$V|is`bG(cSXxUN&)|=O+o0pCU z(|?~^=bo#6LoxQUKtopbm^tQPYD))e%U7;kwsh61b(52(@e1v1dC1|KR;PaKJ+xd$(uQDTfa;@3uyHql22&rz`KG4003)~CJHtV>uDNZrM1-o>uDNZrL~i43LvuxaLWJy diff --git a/Extensions/FreeSql.Extensions.LazyLoading/LazyLoadingComplier.cs b/Extensions/FreeSql.Extensions.LazyLoading/LazyLoadingComplier.cs index dc388bf4..903d31ce 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/LazyLoadingComplier.cs +++ b/Extensions/FreeSql.Extensions.LazyLoading/LazyLoadingComplier.cs @@ -1,9 +1,7 @@ -using Microsoft.CSharp; -using System; +using System; using System.CodeDom.Compiler; -using System.Collections.Generic; +using System.IO; using System.Reflection; -using System.Text; namespace FreeSql.Extensions.LazyLoading { @@ -14,7 +12,7 @@ namespace FreeSql.Extensions.LazyLoading #if ns20 internal static Lazy _compiler = new Lazy(() => { - //var dlls = Directory.GetFiles(Directory.GetParent(Type.GetType("IFreeSql, FreeSql").Assembly.Location).FullName, "*.dll"); + //var dlls = Directory.GetFiles(Directory.GetParent(Type.GetType("IFreeSql, FreeSql").Assembly.Location).FullName, "*.dll;*.exe"); var compiler = new CSScriptLib.RoslynEvaluator(); compiler.DisableReferencingFromCode = false; //compiler.DebugBuild = true; @@ -36,14 +34,41 @@ namespace FreeSql.Extensions.LazyLoading #else - public static Assembly CompileCode(string cscode) { + public static Assembly CompileCode(string cscode) { - using (var compiler = CodeDomProvider.CreateProvider("cs")) { + var files = Directory.GetFiles(Directory.GetParent(Type.GetType("IFreeSql, FreeSql").Assembly.Location).FullName); + using (var compiler = CodeDomProvider.CreateProvider("cs")) { var objCompilerParameters = new CompilerParameters(); objCompilerParameters.ReferencedAssemblies.Add("System.dll"); + objCompilerParameters.ReferencedAssemblies.Add("System.Core.dll"); objCompilerParameters.ReferencedAssemblies.Add("FreeSql.dll"); - objCompilerParameters.GenerateExecutable = false; + foreach (var dll in files) + { + if (!dll.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) && + !dll.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) continue; + + Console.WriteLine(dll); + var dllName = string.Empty; + var idx = dll.LastIndexOf('/'); + if (idx != -1) dllName = dll.Substring(idx + 1); + else + { + idx = dll.LastIndexOf('\\'); + if (idx != -1) dllName = dll.Substring(idx + 1); + } + if (string.IsNullOrEmpty(dllName)) continue; + try + { + var ass = Assembly.LoadFile(dll); + objCompilerParameters.ReferencedAssemblies.Add(dllName); + } + catch + { + + } + } + objCompilerParameters.GenerateExecutable = false; objCompilerParameters.GenerateInMemory = true; CompilerResults cr = compiler.CompileAssemblyFromSource(objCompilerParameters, cscode); diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index f122b094..c7846319 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -788,8 +788,8 @@ namespace FreeSql.Internal .Append(" if (base.").Append(pnv.Name).Append(" == null && __lazy__").Append(pnv.Name).AppendLine(" == false) {"); if (nvref.Exception == null) - cscode.Append(" base.").Append(pnv.Name).Append(" = __fsql_orm__.Select<").Append(propElementType.IsNested ? $"{propElementType.DeclaringType.Namespace}.{propElementType.DeclaringType.Name}.{propElementType.Name}" : $"{propElementType.Namespace}.{propElementType.Name}") - .Append(">().Where(a => __fsql_orm__.Select<").Append(tbmid.Type.IsNested ? $"{tbmid.Type.DeclaringType.Namespace?.NotNullAndConcat(".")}{tbmid.Type.DeclaringType.Name}.{tbmid.Type.Name}" : $"{tbmid.Type.Namespace}.{tbmid.Type.Name}") + cscode.Append(" base.").Append(pnv.Name).Append(" = __fsql_orm__.Select<").Append(propElementType.IsNested ? $"{propElementType.DeclaringType.Namespace?.NotNullAndConcat(".")}{propElementType.DeclaringType.Name}.{propElementType.Name}" : $"{propElementType.Namespace?.NotNullAndConcat(".")}{propElementType.Name}") + .Append(">().Where(a => __fsql_orm__.Select<").Append(tbmid.Type.IsNested ? $"{tbmid.Type.DeclaringType.Namespace?.NotNullAndConcat(".")}{tbmid.Type.DeclaringType.Name}.{tbmid.Type.Name}" : $"{tbmid.Type.Namespace?.NotNullAndConcat(".")}{tbmid.Type.Name}") .Append(">().Where(b => ").Append(lmbdWhere.ToString()).AppendLine(").Any()).ToList();") .Append(" __lazy__").Append(pnv.Name).AppendLine(" = true;"); else @@ -801,7 +801,9 @@ namespace FreeSql.Internal } if (vp?.Item3 == true) { //set 重写 - cscode.Append(" set => base.").Append(pnv.Name).AppendLine(" = value;"); + cscode.Append(" set {\r\n") + .Append(" base.").Append(pnv.Name).AppendLine(" = value;") + .Append(" }\r\n"); } cscode.AppendLine(" }"); } @@ -940,7 +942,9 @@ namespace FreeSql.Internal } if (vp?.Item3 == true) { //set 重写 - cscode.Append(" set => base.").Append(pnv.Name).AppendLine(" = value;"); + cscode.Append(" set {\r\n") + .Append(" base.").Append(pnv.Name).AppendLine(" = value;") + .Append(" }\r\n"); } cscode.AppendLine(" }"); }