/// <summary> /// 创建分组表达式。 /// </summary> /// <param name="source">源表达式。</param> /// <param name="keypro">分组键的CLR描述对象。</param> /// <param name="key">分组键表达式。</param> /// <param name="item">单元项表达式,用于自定义创建分组项表达式。</param> public DbGroupByExpression(DbUnitTypeExpression source, PropertyInfo keypro, DbExpression key, DbUnitItemTypeExpression item) : base(source.ClrType, new DbGroupItemExpression(item)) { Source = source; KeyProperty = keypro; Key = key; }
/// <summary> /// 创建内连接操作表达式。 /// </summary> /// <param name="source">源表达式。</param> /// <param name="target">目标表达式。</param> /// <param name="left">左端匹配键表达式。</param> /// <param name="right">左端匹配键表达式。</param> /// <param name="newExp">连接后输出的新对象表达式,该成员是LINQ连接体系中所必须的。</param> public DbInnerJoinExpression(DbUnitTypeExpression source, DbUnitTypeExpression target, DbExpression left, DbExpression right, DbUnitItemTypeExpression newExp) : base(typeof(IQueryable <>).MakeGenericType(newExp.ClrType), source, newExp) { Target = target; switch (left.ExpressionType) { case EExpressionType.MemberAccess: KeyPairs = new DbJoinKeyPairExpression[] { new DbJoinKeyPairExpression(left, right) }; break; case EExpressionType.New: KeyPairs = (from a in ((DbNewExpression)left).Members join b in ((DbNewExpression)right).Members on a.Key equals b.Key select new DbJoinKeyPairExpression(a.Value, b.Value)).ToArray(); break; default: throw new NotSupportedException(string.Format(Res.NotSupportedExpressionParseInnerJoinKeyPairs, left.ExpressionType)); } }
/// <summary> /// 合并另一个单元表达式。 /// </summary> /// <param name="source">合并目标表达式。</param> /// <returns>合并后的表达式。</returns> public DbUnitTypeExpression Merge(DbUnitTypeExpression source) { this.Take = source.Take; this.Skip = source.Skip; this.Distinct = source.Distinct; if (source._Filters != null && source._Filters.Count > 0) { foreach (var item in source._Filters) { this.Filters.Add(item); } } if (source._Orders != null && source._Orders.Count > 0) { foreach (var item in source._Orders) { this.Orders.Add(item); } } return(this); }
/// <summary> /// 创建SELECT查询表达式。 /// </summary> /// <param name="source">源数据单元表达式。</param> /// <param name="itemType">单元数据项CLR类型。</param> public DbSelectExpression(DbUnitTypeExpression source, DbUnitItemTypeExpression itemType) : base(typeof(IQueryable <>).MakeGenericType(itemType.ClrType), source, itemType) { }
/// <summary> /// 创建分组表达式。 /// </summary> /// <param name="source">源表达式。</param> /// <param name="keypro">分组键的CLR描述对象。</param> /// <param name="key">分组键表达式。</param> public DbGroupByExpression(DbUnitTypeExpression source, PropertyInfo keypro, DbExpression key) : this(source, keypro, key, source.Item) { }
/// <summary> /// 创建笛卡尔积连接表达式。 /// </summary> /// <param name="source">源表达式。</param> /// <param name="target">目标表达式。</param> /// <param name="newExp">连接后输出的项表达式。</param> public DbCrossJoinExpression(DbUnitTypeExpression source, DbUnitTypeExpression target, DbUnitItemTypeExpression newExp) : base(typeof(IQueryable <>).MakeGenericType(newExp.ClrType), source, newExp) { Target = target; }
/// <summary> /// 初始化数据集操作。 /// </summary> /// <param name="type">数据集的元素CLR类型。</param> /// <param name="source">操作的单元表达式。</param> /// <param name="itemType">单元项表达式。</param> public DbSetOperationExpression(Type type, DbUnitTypeExpression source, DbUnitItemTypeExpression itemType) : base(type, itemType) { Source = source; }