コード例 #1
0
        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);
            }
        }
コード例 #2
0
 /// <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);
     }
 }
コード例 #3
0
        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);
        }
コード例 #4
0
ファイル: Lookup.cs プロジェクト: Volodej/smooth.foundations
 /// <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));
 }
コード例 #5
0
ファイル: Lookup.cs プロジェクト: Volodej/smooth.foundations
 /// <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));
 }
コード例 #6
0
ファイル: Lookup.cs プロジェクト: SNUGDC/BeerWorld
 /// <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));
 }
コード例 #7
0
ファイル: Lookup.cs プロジェクト: SNUGDC/BeerWorld
 /// <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));
 }
コード例 #8
0
        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);
        }