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)); }
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)); }