1
0

FreeSqlExt.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using FreeSql.Internal.CommonProvider;
  2. using FreeSql;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Linq.Expressions;
  7. namespace ZhonTai.Admin.Core.Db
  8. {
  9. public class TestMemberExpressionVisitor : ExpressionVisitor
  10. {
  11. public string MemberExpString;
  12. public bool Result { get; private set; }
  13. public static bool IsExists(Expression selector, Expression memberExp)
  14. {
  15. var visitor = new TestMemberExpressionVisitor { MemberExpString = memberExp.ToString() };
  16. visitor.Visit(selector);
  17. return visitor.Result;
  18. }
  19. protected override Expression VisitMember(MemberExpression node)
  20. {
  21. if (!Result && node.ToString() == MemberExpString) Result = true;
  22. return node;
  23. }
  24. }
  25. public static class FreeSqlExt
  26. {
  27. public static List<T1> ToListIgnore<T1>(this ISelect<T1> that, Expression<Func<T1, object>> selector)
  28. {
  29. if (selector == null) return that.ToList();
  30. var s0p = that as Select0Provider;
  31. var tb = s0p._tables[0];
  32. var parmExp = tb.Parameter ?? Expression.Parameter(tb.Table.Type, tb.Alias);
  33. var initExps = tb.Table.Columns.Values
  34. .Where(a => a.Attribute.IsIgnore == false)
  35. .Select(a => new
  36. {
  37. exp = Expression.Bind(tb.Table.Properties[a.CsName], Expression.MakeMemberAccess(parmExp, tb.Table.Properties[a.CsName])),
  38. ignored = TestMemberExpressionVisitor.IsExists(selector, Expression.MakeMemberAccess(parmExp, tb.Table.Properties[a.CsName]))
  39. })
  40. .Where(a => a.ignored == false)
  41. .Select(a => a.exp)
  42. .ToArray();
  43. var lambda = Expression.Lambda<Func<T1, T1>>(
  44. Expression.MemberInit(
  45. Expression.New(tb.Table.Type),
  46. initExps
  47. ),
  48. parmExp
  49. );
  50. return that.ToList(lambda);
  51. }
  52. }
  53. }