当前位置:网站首页>什么都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
边栏推荐
- Kylin on Kubernetes 在 eBay 的实践
- [漫谈] 软件设计的目标和途径
- 屏读时代,我们患上了注意力缺失候群症
- Thinkphp6中where条件中字段与字段比较条件的写法
- Why do we need software engineering -- looking at a simple project
- 技术债务是对业务功能缺乏真正的理解 -daverupert.com
- Facebook开源框架如何简化 PyTorch 实验
- The most hard core of the whole network explains the computer startup process
- What is the relationship between low code vs model driven?
- The samesite problem of cross domain cookie of Chrome browser results in abnormal access to iframe embedded pages
猜你喜欢

DOM node operation

浅谈HiZ-buffer

The samesite problem of cross domain cookie of Chrome browser results in abnormal access to iframe embedded pages

Win10官方1909版本无法打开windows安全中心中病毒和威胁防护的实时保护解决方案。

年薪90万程序员不如月入3800公务员?安稳与高收入,到底如何选择?

一万四千字分布式事务原理解析,全部掌握你还怕面试被问?

洞察——风格注意力网络(SANet)在任意风格迁移中的应用

laravel8更新之维护模式改进

30岁后,你还剩下什么?

vscode 配置
随机推荐
汇编函数mcall systemstack asmcgocall syscall
Insight -- the application of sanet in arbitrary style transfer
Advanced concurrent programming series 9 (lock interface analysis)
The JS solution cannot be executed after Ajax loads HTML
Web API系列(三)统一异常处理
Summary of the resumption of a 618 promotion project
If you want to forget the WiFi network you used to connect to your Mac, try this!
建议患者自杀,OpenAI警告:GPT-3用于医疗目的风险太高
DOM节点操作
AC86U kx上网
Huawei HCIA notes
What kind of technical ability should a programmer who has worked for 1-3 years? How to improve?
Don't treat exceptions as business logic, which you can't afford
Awk implements SQL like join operation
分享几个我日常使用的VS Code插件
Implementation of multi GPU distributed training with horovod in Amazon sagemaker pipeline mode
Deep into web workers (1)
使用 Xunit.DependencyInjection 改造测试项目
Why do we need software engineering -- looking at a simple project
带你深入了解 GitLab CI/CD 原理及流程