mh_frame_sps/APT.Infrastructure.EF/Extensions/IQueryableSelectorExtension.cs

63 lines
2.2 KiB
C#
Raw Normal View History

2026-04-07 13:47:52 +08:00
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
namespace APT.Infrastructure.EF.Extensions
{
public class IQueryableSelectorExtension
{
public static Expression<Func<TSource, TResult>> CreateSelecter<TSource, TResult>(List<string> columns)
{
Expression<Func<TSource, TResult>> selector = null;
            //(rec)
            ParameterExpression param = Expression.Parameter(typeof(TSource), "rec");
            //new ParadigmSearchListData
            var v0 = Expression.New(typeof(TResult));
var memberBindings = new List<MemberBinding>();
foreach (var column in columns)
{
var left = typeof(TResult).GetProperty(column);
var right = Expression.Property(param, typeof(TSource).GetProperty(column));
memberBindings.Add(Expression.Bind(left, right));
}
Expression body = Expression.MemberInit(v0,
//{ Number = rec.NUMBER, Name = rec.RES_NAME }
memberBindings.ToArray());
selector = (Expression<Func<TSource, TResult>>)Expression.Lambda(body, param);
return selector;
}
private static MemberAssignment GetPropertyLambdaExpression(ParameterExpression param, string field)
{
string[] propertyNames = field.Split('.');
Expression propertyAccess = param;
Type type = param.Type;
PropertyInfo property;
foreach (string propertyName in propertyNames)
{
property = type.GetProperty(propertyName);
if (property != null)
{
type = property.PropertyType;
propertyAccess = Expression.MakeMemberAccess(propertyAccess, property);
}
}
//var left = typeof(TResult).GetProperty(column);
//return Expression.Bind(property, Expression.Lambda(propertyAccess, param));
//return Expression.Lambda(propertyAccess, param);
return null;
}
}
}