当前位置:网站首页>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]所创,转载请带上原文链接,感谢