当前位置:网站首页>什么都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
边栏推荐
- From technology to management, the technology of system optimization is applied to enterprise management
- Improvement of maintenance mode of laravel8 update
- 在pandas中使用pipe()提升代码可读性
- Let you have a deep understanding of gitlab CI / CD principle and process
- 如何以计算机的方式去思考
- Kylin on kubernetes' practice on eBay
- 全网最硬核讲解计算机启动流程
- Didi's distributed ID generator (tinyid), easy to use
- It's time to end bertology
- Exception calling 'downloadstring' with '1' arguments: 'operation timed out'
猜你喜欢
After pulling four message queues into a group, they quarreled
The most hard core of the whole network explains the computer startup process
Don't treat exceptions as business logic, which you can't afford
Awk implements SQL like join operation
Win10官方1909版本无法打开windows安全中心中病毒和威胁防护的实时保护解决方案。
来自不同行业领域的50多个对象检测数据集
Count the frequency of letters in text (case insensitive)
Web API series (3) unified exception handling
Using pipe() to improve code readability in pandas
ajax 载入html后不能执行其中的js解决方法
随机推荐
Big data algorithm - bloon filter
laravel8更新之维护模式改进
编程界大佬教你:一行Python代码能做出哪些神奇的事情?
Annual salary of 900000 programmers is not as good as 3800 civil servants a month? How to choose between stability and high income?
awk实现类sql的join操作
全网最硬核讲解计算机启动流程
How Facebook open source framework simplifies pytorch experiment
阿里terway源码分析
从技术谈到管理,把系统优化的技术用到企业管理
Kylin on kubernetes' practice on eBay
The JS solution cannot be executed after Ajax loads HTML
Awk implements SQL like join operation
In the age of screen reading, we suffer from attention deficit syndrome
Win10官方1909版本无法打开windows安全中心中病毒和威胁防护的实时保护解决方案。
awk实现类sql的join操作
Exploration and practice of growingio responsive programming
Let's talk about the locks in the database
Count the frequency of letters in text (case insensitive)
AFO
The samesite problem of cross domain cookie of Chrome browser results in abnormal access to iframe embedded pages