当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- Implementation of Caesar cipher
- C language I blog assignment 03
- WPF 关于绘图个人总结
- Animation techniques and details you may not know
- Data transmission of asynchronous serial communication controlled by group bus communication
- 如何应对事关业务生死的数据泄露和删改?
- On the concurrency of update operation
- The emergence and significance of micro service
- 洞察——风格注意力网络(SANet)在任意风格迁移中的应用
- The CPU does this without the memory
猜你喜欢
随机推荐
C language I blog assignment 03
Web Security (1) -- browser homology strategy
The prediction accuracy of the model is as high as 94%! Using machine learning to solve the 200 billion dollar inventory problem perfectly
How to think in the way of computer
Facebook开源框架如何简化 PyTorch 实验
动态规划——用二进制表示集合的状态压缩DP
技术总监7年自述——如何选择一家好公司
关于update操作并发问题
The CPU does this without the memory
Implementation of Caesar cipher
看一遍就理解,图解单链表反转
What is the relationship between low code vs model driven?
编程界大佬教你:一行Python代码能做出哪些神奇的事情?
【C++学习笔记】C++ 标准库 std::thread 的简单使用,一文搞定还不简单?
Adobe Lightroom /Lr 2021软件安装包(附安装教程)
你可能不知道的Animation动画技巧与细节
关于晋升全栈工程师,从入门到放弃的神功秘籍,不点进来看一看?
Design pattern of facade and mediator
What magic things can a line of Python code do?
当 TiDB 与 Flink 相结合:高效、易用的实时数仓