当前位置:网站首页>Everything is 2020, LINQ query you are still using expression tree
Everything is 2020, LINQ query you are still using expression tree
2020-11-07 20:57:00 【Irving the procedural ape】
1、 brief introduction
I'd like to recommend a good wheel to you today ,System.Linq.Dynamic.Core. We all know
Database applications often rely on “ dynamic SQL”, That is, queries constructed by program logic at run time . Splicing SQL Easy to cause SQL Inject , ordinary LINQ It can be done with an expression tree , But it's also troublesome . recommend System.Linq.Dynamic.Core It's more convenient to use .
This is a Microsoft Assembly .NET 4.0 Dynamic language function of .NET Core / Standard port .
Use this library , Can be in iQueryTable Write news on LINQ Inquire about ( Based on string ):
var query = db.Customers .Where("City == @0 and Orders.Count >= @1", "London", 10) .OrderBy("CompanyName") .Select("new(CompanyName as Name, Phone)");
2、 Use
2.1、nuget
Install-Package System.Linq.Dynamic.Core -Version 1.2.5
2.2、 Common way
using System.Collections;using System.Collections.Generic;using System.Linq.Dynamic.Core.Tests.Helpers;using System.Linq.Dynamic.Core.Tests.Helpers.Models;using System.Linq.Expressions;using System.Reflection;namespace System.Linq.Dynamic.Core.ConsoleTestApp{ public static class E { public static IQueryable GroupBy2<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keyLambda2) { //LambdaExpression keyLambda = DynamicExpression.ParseLambda(source.ElementType, null, "new (Profile.Age)", null); LambdaExpression x = (LambdaExpression)keyLambda2; //return source.Provider.CreateQuery<IGrouping<TKey, TSource>>( // Expression.Call( // typeof(Queryable), "GroupBy", // new Type[] { source.ElementType, keySelector.Body.Type }, // new Expression[] { source.Expression, Expression.Quote(keySelector) } // )); return source.Provider.CreateQuery( Expression.Call( typeof(Queryable), "GroupBy", new Type[] { source.ElementType, x.Body.Type }, new Expression[] { source.Expression, Expression.Quote(x) })); } } public class Program{ public static void Main(string[] args) { Console.WriteLine("--start"); DynamicProperty[] props = { new DynamicProperty("Name", typeof(string)), new DynamicProperty("Birthday", typeof(DateTime)) }; Type type = DynamicClassFactory.CreateType(props); DynamicProperty[] props2 = { new DynamicProperty("Name", typeof(string)), new DynamicProperty("Birthday", typeof(DateTime)) }; Type type2 = DynamicClassFactory.CreateType(props2); DynamicProperty[] props3 = { new DynamicProperty("Name", typeof(int)), new DynamicProperty("Birthday", typeof(DateTime)) }; Type type3 = DynamicClassFactory.CreateType(props3); DynamicClass dynamicClass = Activator.CreateInstance(type) as DynamicClass; dynamicClass.SetDynamicPropertyValue("Name", "Albert"); dynamicClass.SetDynamicPropertyValue("Birthday", new DateTime(1879, 3, 14)); Console.WriteLine(dynamicClass); string n1 = dynamicClass["Name"] as string; Console.WriteLine("dynamicClass[\"Name\"] = '" + n1 + "'"); dynamicClass["NameX"] = "x"; string n2 = dynamicClass["NameX"] as string; Console.WriteLine("dynamicClass[\"NameX\"] = '" + n2 + "'"); //GroupByAndSelect_TestDynamicSelectMember(); //Select(); //TestDyn(); //ExpressionTests_Enum(); //Where(); //ExpressionTests_Sum(); Console.WriteLine("--end"); } private static void GroupByAndSelect_TestDynamicSelectMember() { var testList = User.GenerateSampleModels(51).Where(u => u.Profile.Age < 23); var qry = testList.AsQueryable(); var rrrr = qry.GroupBy2(x => new { x.Profile.Age }); var ll = rrrr.ToDynamicList(); var byAgeReturnAllReal = qry.GroupBy(x => new { x.Profile.Age }).ToList(); var r1 = byAgeReturnAllReal[0]; //var byAgeReturnOK = qry.GroupBy("Profile.Age").ToDynamicList(); // - [0] {System.Linq.Grouping<<>f__AnonymousType0<int?>, System.Linq.Dynamic.Core.Tests.Helpers.Models.User>} object {System.Linq.Grouping<<>f__AnonymousType0<int?>, System.Linq.Dynamic.Core.Tests.Helpers.Models.User>} var byAgeReturnAll = qry.GroupBy("new (Profile.Age)").OrderBy("Key.Age").ToDynamicList(); var q1 = byAgeReturnAll[0]; var k = q1.Key; int? age = k.Age; foreach (var x in byAgeReturnAllReal.OrderBy(a => a.Key.Age)) { Console.WriteLine($"age={x.Key.Age} : users={x.ToList().Count}"); } foreach (var x in byAgeReturnAll) { Console.WriteLine($"age={x.Key.Age} : users={x}"); } } private static void TestDyn() { var user = new User { UserName = "x" }; dynamic userD = user; string username = userD.UserName; Console.WriteLine("..." + username); } public static void ExpressionTests_Enum() { //Arrange var lst = new List<TestEnum> { TestEnum.Var1, TestEnum.Var2, TestEnum.Var3, TestEnum.Var4, TestEnum.Var5, TestEnum.Var6 }; var qry = lst.AsQueryable(); //Act var result1 = qry.Where("it < Te.........
版权声明
本文为[Irving the procedural ape]所创,转载请带上原文链接,感谢
边栏推荐
猜你喜欢
京淘项目day09
Git code submission operation, and git push prompt failed to push some refs'xxx '
Code Review Best Practices
编程界大佬教你:一行Python代码能做出哪些神奇的事情?
Using pipe() to improve code readability in pandas
Got timeout reading communication packets解决方法
一文详解微服务架构
获取树形菜单列表
浅谈HiZ-buffer
The CPU does this without the memory
随机推荐
盘点那些争议最大的编程观点,你是什么看法呢?
聊聊Go代码覆盖率技术与最佳实践
Insight -- the application of sanet in arbitrary style transfer
What magic things can a line of Python code do?
计组-总线通信控制之异步串行通信的数据传输
Kylin on kubernetes' practice on eBay
统计文本中字母的频次(不区分大小写)
Code Review最佳实践
工作1-3年的程序员,应该具备怎么样的技术能力?该如何提升?
Improvement of maintenance mode of laravel8 update
AFO
来自不同行业领域的50多个对象检测数据集
Thinkphp6中where条件中字段与字段比较条件的写法
Git代码提交操作,以及git push提示failed to push some refs'XXX'
easyui dialog“缓存问题”
云计算之路-出海记:整一台 aws 免费云服务器
屏读时代,我们患上了注意力缺失候群症
Getting started with go wire dependency injection
websocket+probuf.原理篇
Jingtao project day09