LinqHelp.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using System;
  2. using System.Linq.Expressions;
  3. namespace Vit.Linq.QueryBuilder
  4. {
  5. public partial class LinqHelp
  6. {
  7. public static MemberExpression GetFieldMemberExpression_ByName(Expression parameter, string propertyOrFieldName)
  8. {
  9. return Expression.PropertyOrField(parameter, propertyOrFieldName);
  10. }
  11. /// <summary>
  12. ///
  13. /// </summary>
  14. /// <param name="parameter"></param>
  15. /// <param name="fieldPath"> could be nasted , example: "name" "depart.name"</param>
  16. /// <returns></returns>
  17. public static MemberExpression GetFieldMemberExpression(ParameterExpression parameter, string fieldPath)
  18. {
  19. MemberExpression memberExp = null;
  20. foreach (var fieldName in fieldPath?.Split('.'))
  21. {
  22. memberExp = GetFieldMemberExpression_ByName(((Expression)memberExp) ?? parameter, fieldName);
  23. }
  24. return memberExp;
  25. }
  26. /// <summary>
  27. ///
  28. /// </summary>
  29. /// <param name="type"></param>
  30. /// <param name="fieldPath"> could be nasted , example: "name" "depart.name"</param>
  31. /// <returns></returns>
  32. public static MemberExpression GetFieldMemberExpression(Type type, string fieldPath)
  33. {
  34. return GetFieldMemberExpression(Expression.Parameter(type), fieldPath);
  35. }
  36. public static Expression<Func<T, object>> GetFieldExpression<T>(string fieldPath)
  37. {
  38. var parammeter = Expression.Parameter(typeof(T));
  39. MemberExpression memberExp = GetFieldMemberExpression(parammeter, fieldPath);
  40. var lambda = Expression.Lambda(memberExp, parammeter).Compile();
  41. return t => lambda.DynamicInvoke(t);
  42. }
  43. }
  44. }