当前位置:网站首页>什么都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
边栏推荐
- Let you have a deep understanding of gitlab CI / CD principle and process
- Share several vs Code plug-ins I use everyday
- Using thread communication to solve the problem of cache penetrating database avalanche
- 一次公交卡被“盗刷”事件带来的思考
- AFO记
- 不要把异常当做业务逻辑,这性能可能你无法承受
- MongoDB下,启动服务时,出现“服务没有响应控制功能”解决方法
- Do not understand the underlying principle of database index? That's because you don't have a B tree in your heart
- 京淘项目day09
- Technical debt is a lack of real understanding of business functions- daverupert.com
猜你喜欢
Web API series (3) unified exception handling
If you want to forget the WiFi network you used to connect to your Mac, try this!
Code Review最佳实践
Didi's distributed ID generator (tinyid), easy to use
Kubernetes服务类型浅析:从概念到实践
华为HCIA笔记
计组-总线通信控制之异步串行通信的数据传输
不要把异常当做业务逻辑,这性能可能你无法承受
Do not understand the underlying principle of database index? That's because you don't have a B tree in your heart
What kind of technical ability should a programmer who has worked for 1-3 years? How to improve?
随机推荐
30岁后,你还剩下什么?
Kylin on kubernetes' practice on eBay
Analysis of kubernetes service types: from concept to practice
vscode 配置
How did I lose control of the team?
浅谈HiZ-buffer
[random talk] the goal and way of software design
洞察——风格注意力网络(SANet)在任意风格迁移中的应用
If you want to forget the WiFi network you used to connect to your Mac, try this!
【C++学习笔记】C++ 标准库 std::thread 的简单使用,一文搞定还不简单?
MongoDB下,启动服务时,出现“服务没有响应控制功能”解决方法
Using pipe() to improve code readability in pandas
Technical debt is a lack of real understanding of business functions- daverupert.com
Application and principle of handlermethodargumentresolver
Tips for Mac novices
Design pattern of facade and mediator
「混合云」会是云计算的下一个战场吗?
Ac86u KX Online
Recommend suicide, openai warns: gpt-3 is too risky for medical purposes
laravel8更新之维护模式改进