You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LuFieldsExpressions.cs 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using System;
  2. using System.Linq.Expressions;
  3. using Luticate2.Auth.Business.Fields;
  4. using Luticate2.Auth.Dbo;
  5. using Luticate2.Auth.Dbo.Fields;
  6. using Luticate2.Auth.Dbo.Result;
  7. using Luticate2.Auth.Interfaces;
  8. using Microsoft.Extensions.DependencyInjection;
  9. namespace Luticate2.Auth.Business.FieldsExpressions
  10. {
  11. public class LuFieldsExpressions<TDbo, TModel> : ILuFieldsExpressions<TDbo, TModel>
  12. {
  13. protected IServiceProvider ServiceProvider { get; }
  14. public LuFieldsExpressions(IServiceProvider serviceProvider)
  15. {
  16. ServiceProvider = serviceProvider;
  17. }
  18. public ILuFieldsExpressions<TDbo2, TModel2> GetService<TDbo2, TModel2>()
  19. {
  20. var service = ServiceProvider.GetService<ILuFieldsExpressions<TDbo2, TModel2>>();
  21. return service;
  22. }
  23. protected LuResult<Expression<Func<TType1, object>>> GetSubField<TType1, TType2, TType3>(
  24. Expression<Func<TType1, TModel>> modelProperty, LuFieldDbo field, Expression<Func<TModel, TType3>> modelSubProperty)
  25. {
  26. var subPropExprResult = LuExpressionUtils.GetSingleMemberFromExpression(modelSubProperty);
  27. if (subPropExprResult == null)
  28. {
  29. return LuResult<Expression<Func<TType1, object>>>.Error(LuStatus.InternalError.ToInt(), "Bad field expression");
  30. }
  31. var prop = Expression.Property(modelProperty.Body, subPropExprResult.Name);
  32. var exp = Expression.Lambda<Func<TType1, TType3>>(prop, modelProperty.Parameters[0]);
  33. var service = GetService<TType2, TType3>();
  34. var finalExpResult = service.GetExpression(exp, field.Popped());
  35. return finalExpResult;
  36. }
  37. protected virtual LuResult<Expression<Func<TType1, object>>> GetExpressionInternal<TType1>(
  38. Expression<Func<TType1, TModel>> modelProperty, LuFieldDbo field)
  39. {
  40. return LuResult<Expression<Func<TType1, object>>>.Error(LuStatus.InputError.ToInt(), $"Unknown field: {field}", "");
  41. }
  42. public virtual LuResult<Expression<Func<TType1, object>>> GetExpression<TType1>(Expression<Func<TType1, TModel>> modelProperty, LuFieldDbo field)
  43. {
  44. if (field.IsRoot())
  45. {
  46. var converted = Expression.Convert(modelProperty.Body, typeof(object));
  47. var exp = Expression.Lambda<Func<TType1, object>>(converted, modelProperty.Parameters[0]);
  48. return LuResult<Expression<Func<TType1, object>>>.Ok(exp);
  49. }
  50. return GetExpressionInternal(modelProperty, field);
  51. }
  52. }
  53. }