当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- AFO
- Animation techniques and details you may not know
- 编程界大佬教你:一行Python代码能做出哪些神奇的事情?
- 如何应对事关业务生死的数据泄露和删改?
- Share several vs Code plug-ins I use everyday
- How to think in the way of computer
- 京淘项目day09
- 看一遍就理解,图解单链表反转
- Practice of Xiaoxiong school development board: real equipment access of smart street lamp sandbox experiment
- On hiz buffer
猜你喜欢
websocket+probuf.原理篇
什么都2020了,LINQ查询你还在用表达式树
【C++学习笔记】C++ 标准库 std::thread 的简单使用,一文搞定还不简单?
数据库基本操作
C language I blog assignment 03
Three steps, one pit, five steps and one thunder, how to lead the technical team under the rapid growth?
Count the frequency of letters in text (case insensitive)
The emergence and significance of micro service
A detailed explanation of microservice architecture
See once to understand, graphic single chain table inversion
随机推荐
Web安全(二)---跨域资源共享
The emergence and significance of micro service
统计文本中字母的频次(不区分大小写)
Stack bracket matching
Kylin on Kubernetes 在 eBay 的实践
洞察——风格注意力网络(SANet)在任意风格迁移中的应用
使用 Xunit.DependencyInjection 改造测试项目
分享几个我日常使用的VS Code插件
Insight -- the application of sanet in arbitrary style transfer
See once to understand, graphic single chain table inversion
The prediction accuracy of the model is as high as 94%! Using machine learning to solve the 200 billion dollar inventory problem perfectly
Adobe media encoder / me 2021 software installation package (with installation tutorial)
快速上手Git
Exploration and practice of growingio responsive programming
Cpp(三) 什么是CMake
Cpp(一) 安装CMake
来自不同行业领域的50多个对象检测数据集
websocket+probuf.原理篇
laravel8更新之维护模式改进
「混合云」会是云计算的下一个战场吗?