/// <summary> /// 创建关联一个强类型查询 /// </summary> /// <typeparam name="TJoinResult"></typeparam> /// <param name="resultSelect"></param> /// <param name="expression"></param> /// <param name="joinType"></param> /// <returns></returns> public ILambdaQueryViewJoin <T, TJoinResult> Join <TJoinResult>(ILambdaQueryResultSelect <TJoinResult> resultSelect, Expression <Func <T, TJoinResult, bool> > expression, JoinType joinType = JoinType.Inner) { if (!resultSelect.BaseQuery.__FromDbContext) { throw new Exception("关联需要由LambdaQuery.CreateQuery创建"); } var query2 = new LambdaQueryViewJoin <T, TJoinResult>(this, resultSelect); //var innerType = typeof(TSource); var innerType = resultSelect.InnerType; //var prefix1 = GetPrefix(innerType); var prefix2 = GetPrefix(typeof(TJoinResult)); var typeQuery = new TypeQuery(innerType, prefix2); var baseQuery = resultSelect.BaseQuery; QueryParames.AddRange(baseQuery.QueryParames); string innerQuery = baseQuery.GetQuery(); typeQuery.InnerQuery = innerQuery; string condition = FormatJoinExpression(expression.Body); AddInnerRelation(typeQuery, joinType, condition); return(query2); }
/// <summary> /// 联合查询 /// 会清除父查询的排序 /// </summary> /// <typeparam name="TResult2"></typeparam> /// <param name="resultSelect"></param> /// <param name="unionType"></param> /// <returns></returns> public ILambdaQueryResultSelect <TResult> Union <TResult2>(ILambdaQueryResultSelect <TResult2> resultSelect, UnionType unionType = UnionType.UnionAll) { BaseQuery.CleanOrder();//清除OrderBy BaseQuery.AddUnion(resultSelect.BaseQuery, unionType); return(this); }
/// <summary> /// 关联查询分支 /// </summary> /// <param name="query"></param> /// <param name="_resultSelect"></param> internal LambdaQueryViewJoin(LambdaQuery <T> query, ILambdaQueryResultSelect <TJoinResult> _resultSelect) { BaseQuery = query; resultSelect = _resultSelect; }
ILambdaQuery <T> InnerSelect <TResult>(Expression <Func <T, TResult> > outField, ILambdaQueryResultSelect <TResult> query, string type, string innerJoinSql = "") { if (!query.BaseQuery.__FromDbContext) { throw new Exception("关联需要由LambdaQuery.CreateQuery创建"); } var baseQuery = query.BaseQuery; QueryParames.AddRange(baseQuery.QueryParames); //foreach (var kv in baseQuery.QueryParames) //{ // QueryParames[kv.Key] = kv.Value; //} var query2 = baseQuery.GetQuery(); return(InnerSelect(outField, query2, type)); }
/// <summary> /// 按!= /// 等效为table.field !=(select field from table2) /// </summary> /// <typeparam name="TResult"></typeparam> /// <param name="query"></param> /// <param name="outField"></param> /// <returns></returns> public ILambdaQuery <T> NotEqual <TResult>(ILambdaQueryResultSelect <TResult> query, Expression <Func <T, TResult> > outField) { return(InnerSelect(outField, query, "!=")); }
/// <summary> /// 按查询not exists /// 等效为 not exixts(select field from table2) /// </summary> /// <typeparam name="TResult"></typeparam> /// <param name="query"></param> /// <returns></returns> public ILambdaQuery <T> NotExists <TResult>(ILambdaQueryResultSelect <TResult> query) { return(InnerSelect(null, query, "not exists")); }