コード例 #1
0
ファイル: FirstSingleBuilder.cs プロジェクト: ferbenor/moro
        protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
        {
            var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
            var take     = 0;

            if (!buildInfo.IsSubQuery || builder.DataContextInfo.SqlProviderFlags.IsSubQueryTakeSupported)
            {
                switch (methodCall.Method.Name)
                {
                case "First":
                case "FirstOrDefault":
                    take = 1;
                    break;

                case "Single":
                case "SingleOrDefault":
                    if (!buildInfo.IsSubQuery)
                    {
                        take = 2;
                    }
                    break;
                }
            }

            if (take != 0)
            {
                builder.BuildTake(sequence, new SqlValue(take));
            }

            return(new FirstSingleContext(buildInfo.Parent, sequence, methodCall));
        }
コード例 #2
0
        protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
        {
            var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
            var take     = 0;

            if (!buildInfo.IsSubQuery || builder.DataContext.SqlProviderFlags.IsSubQueryTakeSupported)
            {
                switch (methodCall.Method.Name)
                {
                case "First":
                case "FirstOrDefault":
                case "FirstAsync":
                case "FirstOrDefaultAsync":
                    take = 1;
                    break;

                case "Single":
                case "SingleOrDefault":
                case "SingleAsync":
                case "SingleOrDefaultAsync":
                    if (!buildInfo.IsSubQuery)
                    {
                        if (buildInfo.SelectQuery.Select.TakeValue == null || buildInfo.SelectQuery.Select.TakeValue is SqlValue takeValue && (int)takeValue.Value ! >= 2)
                        {
                            take = 2;
                        }
                    }

                    break;
                }
            }

            if (take != 0)
            {
                var takeExpression = Configuration.Linq.ParameterizeTakeSkip
                                        ? (ISqlExpression) new SqlParameter(new DbDataType(typeof(int)), "take", take)
                {
                    IsQueryParameter = !builder.DataContext.InlineParameters
                }
                                        : new SqlValue(take);
                builder.BuildTake(sequence, takeExpression, null);
            }

            return(new FirstSingleContext(buildInfo.Parent, sequence, methodCall));
        }