当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- [C + + learning notes] how about the simple use of the C + + standard library STD:: thread?
- Let's talk about the locks in the database
- 看一遍就理解,图解单链表反转
- C++在C的基础上改进了哪些细节
- Cpp(三) 什么是CMake
- Deep into web workers (1)
- Analysis of kubernetes service types: from concept to practice
- Stack bracket matching
- 一万四千字分布式事务原理解析,全部掌握你还怕面试被问?
- How to choose a good company
猜你喜欢
随机推荐
当 TiDB 与 Flink 相结合:高效、易用的实时数仓
动态规划——用二进制表示集合的状态压缩DP
Practice of Xiaoxiong school development board: real equipment access of smart street lamp sandbox experiment
编程界大佬教你:一行Python代码能做出哪些神奇的事情?
某618大促项目的复盘总结
supervisor进程管理安装使用
What is the relationship between low code vs model driven?
It's time to end bertology
awk实现类sql的join操作
The most hard core of the whole network explains the computer startup process
Awk implements SQL like join operation
Adobe Prelude / PL 2020 software installation package (with installation tutorial)
年薪90万程序员不如月入3800公务员?安稳与高收入,到底如何选择?
When tidb and Flink are combined: efficient and easy to use real-time data warehouse
洞察——风格注意力网络(SANet)在任意风格迁移中的应用
面部识别:攻击类型和反欺骗技术
How Facebook open source framework simplifies pytorch experiment
小熊派开发板实践:智慧路灯沙箱实验之真实设备接入
你可能不知道的Animation动画技巧与细节
Python 图片识别 OCR