/// <summary> /// 创建二元操作表达式。 /// </summary> /// <param name="kind">二元操作种类。</param> /// <param name="left">左端表达式。</param> /// <param name="right">右端表达式。</param> /// <param name="type">两端操作数据类型。</param> public DbBinaryExpression(EBinaryKind kind, DbExpression left, DbExpression right, Type type) { Kind = kind; Left = left; Right = right; ClrType = type; }
/// <summary> /// 初始化二元逻辑运算。 /// </summary> /// <param name="context">生成上下文。生成上下文。</param> /// <param name="kind">逻辑运算种类。</param> public BinaryLogicalFragment(GenerateContext context, EBinaryKind kind) : base(context) { if (kind == EBinaryKind.AndAlso || kind == EBinaryKind.OrElse) { Kind = kind; } else { throw new ArgumentException(Res.ExceptionBinaryLogicalKind, nameof(kind)); } }
/// <summary> /// 向指定的表达式语句片段合并多个<see cref="IExpressionFragment"/>片段。 /// </summary> /// <param name="target">目标语句片段</param> /// <param name="kind">逻辑操作符种类。</param> /// <param name="fragments">合并的语句片段集合。</param> /// <returns>合并结果。</returns> public static ILogicFragment Merge(this IExpressionFragment target, EBinaryKind kind, IEnumerable <IExpressionFragment> fragments) { var current = target as BinaryLogicalFragment; if (!fragments.Any()) { throw new ArgumentException(Res.ExceptionMergeFragmentIsNotEmpty, nameof(fragments)); } foreach (var fragment in fragments) { if (current == null) { if (fragment is BinaryLogicalFragment binary && binary.Kind == kind) { current = binary; current.Expressions.Insert(0, target); } else { current = new BinaryLogicalFragment(target.Context, kind); current.Expressions.Add(target); current.Expressions.Add(fragment); } }
/// <summary> /// 初始化二元运算。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="kind">二元运算种类。</param> public BinaryFragment(GenerateContext context, EBinaryKind kind) : base(context) { Kind = kind; }
/// <summary> /// 合并多个<see cref="IExpressionFragment"/>片段为一个逻辑判断语句片段。 /// </summary> /// <param name="fragments">合并的语句片段集合。</param> /// <param name="kind">逻辑操作符种类。</param> /// <returns>合并结果。</returns> public static ILogicFragment Merge(this IEnumerable <IExpressionFragment> fragments, EBinaryKind kind = EBinaryKind.AndAlso) { var array = fragments.ToArray(); if (array.Length == 1) { return(array[0] as ILogicFragment); } var other = new IExpressionFragment[array.Length - 1]; Array.Copy(array, 1, other, 0, other.Length); return(Merge(array[0], kind, other)); }
/// <summary> /// 合并多个<see cref="BinaryFragment"/>片段为一个逻辑判断语句片段。 /// </summary> /// <param name="fragments">合并的语句片段集合。</param> /// <param name="kind">逻辑操作符种类。</param> /// <returns>合并结果。</returns> public static ILogicFragment Merge(this IEnumerable <BinaryFragment> fragments, EBinaryKind kind = EBinaryKind.AndAlso) => Merge(fragments, kind);