当前位置:网站首页>什么都2020了,LINQ查询你还在用表达式树
什么都2020了,LINQ查询你还在用表达式树
2020-11-07 20:57:00 【程序猿欧文】
1、简介
今天给大家推荐个好的轮子,System.Linq.Dynamic.Core。我们都知道
数据库应用程序经常依赖于“动态SQL”,即在运行时通过程序逻辑构造的查询。拼接SQL容易造成SQL注入,普通的LINQ可以用表达式树来完成,但也比较麻烦。推荐System.Linq.Dynamic.Core用起来比较方便。
这是Microsoft程序集的.NET 4.0动态语言功能的.NET Core /标准端口。
使用此库,可以在iQueryTable上编写动态LINQ查询(基于字符串):
var query = db.Customers .Where("City == @0 and Orders.Count >= @1", "London", 10) .OrderBy("CompanyName") .Select("new(CompanyName as Name, Phone)");
2、使用
2.1、nuget
Install-Package System.Linq.Dynamic.Core -Version 1.2.5
2.2、常见方式
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.........
版权声明
本文为[程序猿欧文]所创,转载请带上原文链接,感谢
https://my.oschina.net/mikeowen/blog/4707705
边栏推荐
- 模型预测准确率高达94%!利用机器学习完美解决2000亿美元库存难题
- 如何以计算机的方式去思考
- Using pipe() to improve code readability in pandas
- When tidb and Flink are combined: efficient and easy to use real-time data warehouse
- 一万四千字分布式事务原理解析,全部掌握你还怕面试被问?
- 盘点那些争议最大的编程观点,你是什么看法呢?
- 高级并发编程系列九(Lock接口分析)
- 工作1-3年的程序员,应该具备怎么样的技术能力?该如何提升?
- Adobe Prelude /Pl 2020软件安装包(附安装教程)
- Share several vs Code plug-ins I use everyday
猜你喜欢
On the coverage technology and best practice of go code
From technology to management, the technology of system optimization is applied to enterprise management
laravel8更新之维护模式改进
ajax 载入html后不能执行其中的js解决方法
【C++学习笔记】C++ 标准库 std::thread 的简单使用,一文搞定还不简单?
浅谈HiZ-buffer
华为HCIA笔记
Git code submission operation, and git push prompt failed to push some refs'xxx '
Don't treat exceptions as business logic, which you can't afford
Let's talk about the locks in the database
随机推荐
laravel8更新之维护模式改进
In the age of screen reading, we suffer from attention deficit syndrome
C语言Ⅰ博客作业03
Why do we need software engineering -- looking at a simple project
一次公交卡被“盜刷”事件帶來的思考
The JS solution cannot be executed after Ajax loads HTML
Using thread communication to solve the problem of cache penetrating database avalanche
京淘项目day09
Web API series (3) unified exception handling
graph generation model
编程界大佬教你:一行Python代码能做出哪些神奇的事情?
30岁后,你还剩下什么?
某618大促项目的复盘总结
Deep into web workers (1)
屏读时代,我们患上了注意力缺失候群症
Dynamic programming -- state compression DP of set represented by binary
Web API系列(三)统一异常处理
Three steps, one pit, five steps and one thunder, how to lead the technical team under the rapid growth?
Improvement of maintenance mode of laravel8 update
阿里terway源码分析