DynamicCrossJoinGrid.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using InABox.Core;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Linq.Expressions;
  6. using System.Text;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. namespace InABox.DynamicGrid;
  10. public abstract class DynamicCrossJoinGrid<TEntity, TLeft> : DynamicDataGrid<TEntity>
  11. where TEntity : Entity, IRemotable, IPersistent, new()
  12. where TLeft : Entity
  13. {
  14. public TLeft? Left { get; set; }
  15. public abstract Expression<Func<TEntity, Guid>> LeftMapping { get; }
  16. public abstract Expression<Func<TLeft, Guid>> LeftProperty { get; }
  17. protected override void DoReconfigure(DynamicGridOptions options)
  18. {
  19. base.DoReconfigure(options);
  20. options.Clear();
  21. options.SelectColumns = true;
  22. }
  23. public override DynamicGridColumns GenerateColumns()
  24. {
  25. var columns = base.GenerateColumns();
  26. var prefix = $"{typeof(TLeft).Name}.";
  27. columns.RemoveAll(x => x.ColumnName.StartsWith(prefix));
  28. return columns;
  29. }
  30. protected override void Reload(
  31. Filters<TEntity> criteria, Columns<TEntity> columns, ref SortOrder<TEntity>? sort,
  32. CancellationToken token, Action<CoreTable?, Exception?> action)
  33. {
  34. var filter = new Filter<TEntity>();
  35. filter.Expression = CoreUtils.ExtractMemberExpression<TEntity, Guid>(LeftMapping);
  36. filter.Operator = Operator.IsEqualTo;
  37. filter.Value = CoreUtils.GetPropertyValue(Left, CoreUtils.GetFullPropertyName(LeftProperty, "."));
  38. criteria.Add(filter);
  39. base.Reload(criteria, columns, ref sort, token, action);
  40. }
  41. }