sqlsugar入门(7)-IStringSugar(非泛型增删改查)
1、构建查询需要反射的方法
实现的核心思路就是反射。
然而泛型方法想要反射获取指定的方法通过指定参数类型不能直接的获取到。所以写了一个SqlFuncAssembly存储有用到的
泛型方法。例如反射一个两表联查用参数匹配太费劲:var queryable1 = ssc.GetType().GetMethods().Where(o => o.Name == "Queryable" && o.GetGenericArguments().Length == 2 && o.GetParameters()[0].Member.ToString() == "SqlSugar.ISugarQueryable`2[T,T2] Queryable[T,T2](System.Linq.Expressions.Expression`1[System.Func`3[T,T2,System.Object[]]])").ToList()[0];
写个通用的匹配方法,var querymethods = SqlFuncAssembly.SqlSugarClientMethods.Where(o => o.Name == "Queryable" && o.GenericArgumentCount == tablenames.Count && o.IsFunc && o.SugarAssemblyTypeList.Last().FuncTypeList.Last().Name == typeof(object[]).Name).Select(o => o.MethodInfo).ToList();实现方法在SqlFuncAssembly类中。
2、照搬Delete,Update,Query,Insert中想要的方法例如Queryable,Select等。反射实现这些方法。
3、组合所有实现的接口到统一的接口中。
4、查询示例
SqlFuncAssembly.Load("TestModel.dll"); var ssc1 = SqlFuncEx.GetDB("server=127.0.0.1;database=SqlSugar4XTest;uid=sa;pwd=123456", SqlSugar.DbType.SqlServer); StringSugar stringQueryable = new StringSugar(ssc1); var tables = new List<string>() { "Order", "OrderDetail" }; var joins = new List<(string, string, JoinType)>() { ("Order.Id", "OrderDetail.OrderId", JoinType.Left) }; ConditionalModel ConditionalModel = new ConditionalModel(); ConditionalModel.FieldName = "id"; ConditionalModel.FieldValue = "2"; ConditionalModel.ConditionalType = ConditionalType.Equal; var list113 = stringQueryable.Queryable(tables).Join(joins).Where(new List<IConditionalModel>() { ConditionalModel }).Where("id = 2").ToList(); var list112 = stringQueryable.Queryable(tables).Join(joins).Where("id = 2").ToList(); var list111 = stringQueryable.Queryable("Order").Where("id = 2").ToList(); StringSugar StringSugar = new StringSugar(ssc1); //var ww = StringSugar.Updateable(Order).WhereColumns("Id").ExecuteCommand(); var wwlist = StringSugar.Queryable("Order").Where("id = 10").ToList();
浙公网安备 33010602011771号