private void SetJoin(JoinContext join, string name, string varName) { var dq = new DataCube(name, DataStatement.JOIN, varName); if (join != null) { MultijoinContext mj = join.multijoin(); if (mj != null) { List <RelationContext> rc = mj.relation().ToList(); foreach (RelationContext r in rc) { dq.JoinStatement.Add(new State.Join() { JoinType = join.JOINTYPE().GetText(), JoinData = r.joindata().GetText(), JoinField = r.joinfield().GetText(), JoinedData = r.joineddata().GetText(), JoinedField = r.joinedfield().GetText() }); } } DataCubes.Add(dq); } }
/// <summary> /// Получает набор последних данных из бд через Join /// </summary> /// <returns></returns> public static List <SGSPointData> GetPointData() { using (var context = new JoinContext()) { var res = (from pd in context.PointsData join p in context.Points on pd.IdSGSPoint equals p.Id where p.LastDTSafeValue == pd.DateOfValue select pd).ToList(); return(res); } }
protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) { var outerContext = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0])); var innerContext = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[1], new SelectQuery())); JoinType joinType; var conditionIndex = 2; switch (methodCall.Method.Name) { case "InnerJoin": joinType = JoinType.Inner; break; case "CrossJoin": joinType = JoinType.Inner; conditionIndex = -1; break; case "LeftJoin": joinType = JoinType.Left; break; case "RightJoin": joinType = JoinType.Right; break; case "FullJoin": joinType = JoinType.Full; break; default: conditionIndex = 3; var joinValue = (SqlJoinType)methodCall.Arguments[2].EvaluateExpression(); switch (joinValue) { case SqlJoinType.Inner: joinType = JoinType.Inner; break; case SqlJoinType.Left: joinType = JoinType.Left; break; case SqlJoinType.Right: joinType = JoinType.Right; break; case SqlJoinType.Full: joinType = JoinType.Full; break; default: throw new ArgumentOutOfRangeException(); } break; } if (joinType == JoinType.Right || joinType == JoinType.Full) { outerContext = new DefaultIfEmptyBuilder.DefaultIfEmptyContext(buildInfo.Parent, outerContext, null); } outerContext = new SubQueryContext(outerContext); if (joinType == JoinType.Left || joinType == JoinType.Full) { innerContext = new DefaultIfEmptyBuilder.DefaultIfEmptyContext(buildInfo.Parent, innerContext, null); } innerContext = new SubQueryContext(innerContext); var selector = (LambdaExpression)methodCall.Arguments[methodCall.Arguments.Count - 1].Unwrap(); outerContext.SetAlias(selector.Parameters[0].Name); innerContext.SetAlias(selector.Parameters[1].Name); var joinContext = new JoinContext(buildInfo.Parent, selector, outerContext, innerContext) #if DEBUG { MethodCall = methodCall } #endif ; if (conditionIndex != -1) { var condition = (LambdaExpression)methodCall.Arguments[conditionIndex].Unwrap(); var conditionExpr = condition.GetBody(selector.Parameters[0], selector.Parameters[1]); conditionExpr = builder.ConvertExpression(conditionExpr); var join = new SqlFromClause.Join(joinType, innerContext.SelectQuery, null, false, Array <SqlFromClause.Join> .Empty); outerContext.SelectQuery.From.Tables[0].Joins.Add(join.JoinedTable); builder.BuildSearchCondition( joinContext, conditionExpr, join.JoinedTable.Condition.Conditions, false); } else { outerContext.SelectQuery.From.Table(innerContext.SelectQuery); } return(joinContext); }
/// <summary> /// Returns a Slinq that enumerates an inner join of the lookup with the specified Slinq using the specified selectors. /// When the enumeration is complete, the lookup and any values it contains are added to the disposal queue. /// </summary> public Slinq <U, JoinContext <U, K, T, T2, C2, P> > JoinAndDispose <U, T2, C2, P>(Slinq <T2, C2> outer, Func <T2, P, K> outerSelector, Func <T2, T, P, U> resultSelector, P parameter) { return(JoinContext <U, K, T, T2, C2, P> .Join(this, outer, outerSelector, resultSelector, parameter, true)); }
/// <summary> /// Returns a Slinq that enumerates an inner join of the lookup with the specified Slinq using the specified selectors. /// Ownership of the lookup and any values it contains is retained by the caller. /// </summary> public Slinq <U, JoinContext <U, K, T, T2, C2> > JoinAndKeep <U, T2, C2>(Slinq <T2, C2> outer, Func <T2, K> outerSelector, Func <T2, T, U> resultSelector) { return(JoinContext <U, K, T, T2, C2> .Join(this, outer, outerSelector, resultSelector, false)); }
/// <summary> /// Returns a Slinq that enumerates an inner join of the lookup with the specified Slinq using the specified selectors. /// /// When the enumeration is complete, the lookup and any values it contains are added to the disposal queue. /// </summary> public Slinq <U, JoinContext <U, K, T, T2, C2> > JoinAndDispose <U, T2, C2>(Slinq <T2, C2> outer, DelegateFunc <T2, K> outerSelector, DelegateFunc <T2, T, U> resultSelector) { return(JoinContext <U, K, T, T2, C2> .Join(this, outer, outerSelector, resultSelector, true)); }
/// <summary> /// Returns a Slinq that enumerates an inner join of the lookup with the specified Slinq using the specified selectors. /// /// Ownership of the lookup and any values it contains is retained by the caller. /// </summary> public Slinq <U, JoinContext <U, K, T, T2, C2, P> > JoinAndKeep <U, T2, C2, P>(Slinq <T2, C2> outer, DelegateFunc <T2, P, K> outerSelector, DelegateFunc <T2, T, P, U> resultSelector, P parameter) { return(JoinContext <U, K, T, T2, C2, P> .Join(this, outer, outerSelector, resultSelector, parameter, false)); }
protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) { var outerContext = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0])); var innerContext = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[1], new SelectQuery())); List <SqlQueryExtension>?extensions = null; if (innerContext is QueryExtensionBuilder.JoinHintContext jhc) { innerContext = jhc.Context; extensions = jhc.Extensions; } JoinType joinType; var conditionIndex = 2; switch (methodCall.Method.Name) { case "InnerJoin": joinType = JoinType.Inner; break; case "CrossJoin": joinType = JoinType.Inner; conditionIndex = -1; break; case "LeftJoin": joinType = JoinType.Left; break; case "RightJoin": joinType = JoinType.Right; break; case "FullJoin": joinType = JoinType.Full; break; default: conditionIndex = 3; joinType = (SqlJoinType)methodCall.Arguments[2].EvaluateExpression() !switch { SqlJoinType.Inner => JoinType.Inner, SqlJoinType.Left => JoinType.Left, SqlJoinType.Right => JoinType.Right, SqlJoinType.Full => JoinType.Full, _ => throw new InvalidOperationException($"Unexpected join type: {(SqlJoinType)methodCall.Arguments[2].EvaluateExpression()!}") }; break; } if (joinType == JoinType.Right || joinType == JoinType.Full) { outerContext = new DefaultIfEmptyBuilder.DefaultIfEmptyContext(buildInfo.Parent, outerContext, null); } outerContext = new SubQueryContext(outerContext); if (joinType == JoinType.Left || joinType == JoinType.Full) { innerContext = new DefaultIfEmptyBuilder.DefaultIfEmptyContext(buildInfo.Parent, innerContext, null); } innerContext = new SubQueryContext(innerContext); var selector = (LambdaExpression)methodCall.Arguments[methodCall.Arguments.Count - 1].Unwrap(); outerContext.SetAlias(selector.Parameters[0].Name); innerContext.SetAlias(selector.Parameters[1].Name); var joinContext = new JoinContext(buildInfo.Parent, selector, outerContext, innerContext) #if DEBUG { Debug_MethodCall = methodCall } #endif ; if (conditionIndex != -1) { var condition = (LambdaExpression)methodCall.Arguments[conditionIndex].Unwrap(); var conditionExpr = condition.GetBody(selector.Parameters[0], selector.Parameters[1]); conditionExpr = builder.ConvertExpression(conditionExpr); var join = new SqlFromClause.Join(joinType, innerContext.SelectQuery, null, false, Array <SqlFromClause.Join> .Empty); outerContext.SelectQuery.From.Tables[0].Joins.Add(join.JoinedTable); if (extensions != null) { join.JoinedTable.SqlQueryExtensions = extensions; } builder.BuildSearchCondition( joinContext, conditionExpr, @join.JoinedTable.Condition.Conditions); } else { outerContext.SelectQuery.From.Table(innerContext.SelectQuery); } return(joinContext); }