C# dynamically creates lambda expressions
Recently, I used the EF framework. I didn’t know how to do it when I was doing a multi-condition where query. I searched online. At first, I used the <T> method to write SQL statements. Later, I encountered another problem that SqlParamterCollection has been defined in another way. I searched for it and found out about what the problem was. I felt that using EF was really inconvenient, and it was better to use Dapper to develop efficiently. Then I searched the Internet for keywords EF framework, which opened the door to a new world.
I learned how to write it dynamically
The code is as follows:
//querydata is Dictionary<string,string> Put the attribute name and corresponding value to query ParameterExpression pe = (typeof(Customer), "customer");//The parameters in the lambda expression are single parameters here Expression left;//A equivalent to a=b Expression right;//B equivalent to a=b Expression e;//As the vector of the final expression formed //Put an initial value first and then replace it otherwise it will be inconvenient to use in the loop left = (pe, typeof(Customer).GetProperty("name"));// right = ("Peak Poplar");//Constant method sets the value corresponding to the attribute e = (left, right);//=="Peak Poplar" //Dictionary of circular query condition foreach (var item in querydata) { if (!().Trim().Equals("")) { left = (pe, typeof(SFC_Package).GetProperty()); right = (); if (index == 0) { e = (left, right); index++; } else { if (e != null) { Expression tempe; tempe = (left, right); e = (tempe, e);//Add one && to connect two judgments } } } } IQueryable<Customer> queryableData = <Customer>();//Convert the IEnumerable type to IQueryable //The lambda expression of the Where method MethodCallExpression whereCallExpression = ( typeof(Queryable), "Where", new Type[] { }, , <Func<SFC_Package, bool>>(e, new ParameterExpression[] { pe })); //The lambda expression of the OrderBy method is a bit redundant. I am not used to writing it for the first time. I think about it and I repeated it a lot. var propertyinfo=typeof(Customer).GetProperty("Name"); Expression body=(pe,propertyinfo); Type nametype=; MethodCallExpression orderByCallExpression = ( typeof(Queryable), "OrderBy", new Type[] { , nametype},//In fact, it can be written as ("Name").PropertyType whereCallExpression, (body, pe)); //Query data using the created lambda expression ps:IQueryable and IEnumerable can convert and process query results easily. IQueryable<SFC_Package> results = <Customer>(orderByCallExpression);
There is also a simple multi-condition query method on the Internet, which is equivalent to
var data=(o=>=="Ximen Chuxue"); data=(o=>="Male God")
Using loops to implement multiple conditions in Where multiple conditions can cause multiple database queries, but it is used in Linq to Object
It should be pretty good on it.
The last learning dynamic creation of lambda expression addressesClick to open the link
Lambda expression dynamic stitching generation tool class
public static class LambdaUtil<T> { /// <summary> /// lambda expression: t=>true /// </summary> /// <returns></returns> public static Expression<Func<T, bool>> True() { return t => true; } /// <summary> /// lambda expression: t=>false /// </summary> /// <returns></returns> public static Expression<Func<T, bool>> False() { return t => false; } /// <summary> /// lambda expression: t=> /// Mostly used for order sorting /// </summary> /// <typeparam name="T">param type</typeparam> /// <typeparam name="TKey">Return type</typeparam> /// <param name="propName">Property name</param> /// <returns></returns> private static Expression<Func<T, TKey>> Order<TKey>(string propName) { // Create node parameter t ParameterExpression parameter = (typeof(T), "t"); // Create a property MemberExpression property = (parameter, propName); // Generate lambda expressions return <Func<T, TKey>>(property, parameter); } /// <summary> /// lambda expression: t=>==propValue /// Mostly used in where conditions /// </summary> /// <typeparam name="T">param type</typeparam> /// <param name="propName">Property name</param> /// <param name="propValue">Property value</param> /// <returns></returns> public static Expression<Func<T, bool>> Equal(string propName, object propValue) { // Create node parameter t ParameterExpression parameter = (typeof(T), "t"); // Create a member (field/properties) MemberExpression member = (parameter, propName); // Create a constant ConstantExpression constant = (propValue); // Create an equal comparison Expression BinaryExpression binary = (member, constant); // Generate lambda expressions return <Func<T, bool>>(binary, parameter); } /// <summary> /// lambda expression: t=>!=propValue /// Mostly used in where conditions /// </summary> /// <typeparam name="T">param type</typeparam> /// <param name="propName">Property name</param> /// <param name="propValue">Property value</param> /// <returns></returns> public static Expression<Func<T, bool>> NotEqual(string propName, object propValue) { // Create node parameter t ParameterExpression parameter = (typeof(T), "t"); // Create a member (field/properties) MemberExpression member = (parameter, propName); // Create a constant ConstantExpression constant = (propValue); // Create an unequal comparison Expression BinaryExpression binary = (member, constant); // Generate lambda expressions return <Func<T, bool>>(binary, parameter); } /// <summary> /// lambda expression: t=><propValue /// Mostly used in where conditions /// </summary> /// <typeparam name="T">param type</typeparam> /// <param name="propName">Property name</param> /// <param name="propValue">Property value</param> /// <returns></returns> public static Expression<Func<T, bool>> LessThan(string propName, object propValue) { // Create node parameter t ParameterExpression parameter = (typeof(T), "t"); // Create a member (field/properties) MemberExpression member = (parameter, propName); // Create a constant ConstantExpression constant = (propValue); // Create an unequal comparison Expression BinaryExpression binary = (member, constant); // Generate lambda expressions return <Func<T, bool>>(binary, parameter); } /// <summary> /// lambda expression: t=><=propValue /// Mostly used in where conditions /// </summary> /// <typeparam name="T">param type</typeparam> /// <param name="propName">Property name</param> /// <param name="propValue">Property value</param> /// <returns></returns> public static Expression<Func<T, bool>> LessThanOrEqual(string propName, object propValue) { // Create node parameter t ParameterExpression parameter = (typeof(T), "t"); // Create a member (field/properties) MemberExpression member = (parameter, propName); // Create a constant ConstantExpression constant = (propValue); // Create an unequal comparison Expression BinaryExpression binary = (member, constant); // Generate lambda expressions return <Func<T, bool>>(binary, parameter); } /// <summary> /// lambda expression: t=>>propValue /// Mostly used in where conditions /// </summary> /// <typeparam name="T">param type</typeparam> /// <param name="propName">Property name</param> /// <param name="propValue">Property value</param> /// <returns></returns> public static Expression<Func<T, bool>> GreaterThan(string propName, object propValue) { // Create node parameter t ParameterExpression parameter = (typeof(T), "t"); // Create a member (field/properties) MemberExpression member = (parameter, propName); // Create a constant ConstantExpression constant = (propValue); // Create an unequal comparison Expression BinaryExpression binary = (member, constant); // Generate lambda expressions return <Func<T, bool>>(binary, parameter); } /// <summary> /// lambda expression: t=>>=propValue /// Mostly used in where conditions /// </summary> /// <typeparam name="T">param type</typeparam> /// <param name="propName">Property name</param> /// <param name="propValue">Property value</param> /// <returns></returns> public static Expression<Func<T, bool>> GreaterThanOrEqual(string propName, object propValue) { // Create node parameter t ParameterExpression parameter = (typeof(T), "t"); // Create a member (field/properties) MemberExpression member = (parameter, propName); // Create a constant ConstantExpression constant = (propValue); // Create an unequal comparison Expression BinaryExpression binary = (member, constant); // Generate lambda expressions return <Func<T, bool>>(binary, parameter); } /// <summary> /// lambda expression: t=>{(propvalue1) ||...||(propvalueN)} /// Mostly used in where conditions /// </summary> /// <typeparam name="T">param type</typeparam> /// <param name="propName">Property name</param> /// <param name="propValues">Attribute value array</param> /// <returns></returns> public static Expression<Func<T, bool>> In(string propName, string[] propValues) { // Create node parameter t ParameterExpression parameter = (typeof(T), "t"); // left // Create a member (field/properties) MemberExpression member = (parameter, propName); // Create a constant Expression constant = (false); // Create a method MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); foreach (string item in propValues) { // Create a method with parameter expression MethodCallExpression methodCall = (member, method, (item)); // right // Connect parameter method constant = (methodCall, constant); } // Generate lambda expressions return <Func<T, bool>>(constant, new ParameterExpression[] { parameter }); } /// <summary> /// lambda expression: t=>{!((propvalue1) ||...||(propvalueN))} /// Mostly used in where conditions /// </summary> /// <typeparam name="T">param type</typeparam> /// <param name="propName">Property name</param> /// <param name="propValues">Attribute value array</param> /// <returns></returns> public static Expression<Func<T, bool>> NotIn(string propName, string[] propValues) { // Create node parameter t ParameterExpression parameter = (typeof(T), "t"); // Create a member (field/properties) MemberExpression member = (parameter, propName); // Create a constant Expression constant = (false); // Create a method MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); foreach (string item in propValues) { // Create a method with parameter expression MethodCallExpression methodCall = (member, method, (item)); // right // Connect parameter method constant = (methodCall, constant); } // Generate lambda expressions return <Func<T, bool>>((constant), new ParameterExpression[] { parameter }); } /// <summary> /// lambda expression: t=>(propValue) /// Mostly used in where conditions /// </summary> /// <typeparam name="T">param type</typeparam> /// <param name="propName">Property name</param> /// <param name="propValue">Property value</param> /// <returns></returns> public static Expression<Func<T, bool>> Contains(string propName, string propValue) { // Create node parameter t ParameterExpression parameter = (typeof(T), "t"); // Create a member (field/properties) MemberExpression member = (parameter, propName); // Create a constant ConstantExpression constant = (propValue, typeof(string)); // Create a method MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); // Create a method with parameter expression MethodCallExpression methodCall = (member, method, constant); // Generate lambda expressions return <Func<T, bool>>(methodCall, parameter); } /// <summary> /// lambda expression: t=>(propValue) /// Mostly used in where conditions /// </summary> /// <typeparam name="T">param type</typeparam> /// <param name="propName">Property name</param> /// <param name="propValue">Property value</param> /// <returns></returns> public static Expression<Func<T, bool>> StartWith(string propName, string propValue) { // Create node parameter t ParameterExpression parameter = (typeof(T), "t"); // Create a member (field/properties) MemberExpression member = (parameter, propName); // Create a constant ConstantExpression constant = (propValue, typeof(string)); // Create a method MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) }); // Create a method with parameter expression MethodCallExpression methodCall = (member, method, constant); // Generate lambda expressions return <Func<T, bool>>(methodCall, parameter); } /// <summary> /// lambda expression: t=>(propValue) /// Mostly used in where conditions /// </summary> /// <typeparam name="T">param type</typeparam> /// <param name="propName">Property name</param> /// <param name="propValue">Property value</param> /// <returns></returns> public static Expression<Func<T, bool>> EndsWith(string propName, string propValue) { // Create node parameter t ParameterExpression parameter = (typeof(T), "t"); // Create a member (field/properties) MemberExpression member = (parameter, propName); // Create a constant ConstantExpression constant = (propValue, typeof(string)); // Create a method MethodInfo method = typeof(string).GetMethod("EndsWith", new[] { typeof(string) }); // Create a method with parameter expression MethodCallExpression methodCall = (member, method, constant); // Generate lambda expressions return <Func<T, bool>>(methodCall, parameter); } /// <summary> /// lambda expression:!(t=>(propValue)) /// Mostly used in where conditions /// </summary> /// <typeparam name="T">param type</typeparam> /// <param name="propName">Property name</param> /// <param name="propValue">Property value</param> /// <returns></returns> public static Expression<Func<T, bool>> NotContains(string propName, string propValue) { // Create node parameter t ParameterExpression parameter = (typeof(T), "t"); // Create a member (field/properties) MemberExpression member = (parameter, propName); // Create a constant ConstantExpression constant = (propValue, typeof(string)); // Create a method MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); // Create a method with parameter expression MethodCallExpression methodCall = (member, method, constant); // Generate lambda expressions return <Func<T, bool>>((methodCall), parameter); } /// <summary> /// lambda expression: t=>{left and right} /// Mostly used in where conditions /// </summary> /// <param name="left">Left conditions</param> /// <param name="right">Right condition</param> /// <returns></returns> public static Expression<Func<T, bool>> And(Expression<Func<T, bool>> left, Expression<Func<T, bool>> right) { // Create parameter expression InvocationExpression invocation = (right, <Expression>()); // Create and operation BinaryExpression binary = (, invocation); // Generate lambda expressions return <Func<T, bool>>(binary, ); } /// <summary> /// lambda expression: t=>{left or right} /// Mostly used in where conditions /// </summary> /// <param name="left">Left conditions</param> /// <param name="right">Right condition</param> /// <returns></returns> public static Expression<Func<T, bool>> Or(Expression<Func<T, bool>> left, Expression<Func<T, bool>> right) { // Create parameter expression InvocationExpression invocation = (right, <Expression>()); // Create or operation BinaryExpression binary = (, invocation); // Generate lambda expressions return <Func<T, bool>>(binary, ); } }
Summarize
The above is personal experience. I hope you can give you a reference and I hope you can support me more.