I am trying to build a query like this
var d = dbContext.Picks
.Where( /* some conditions */ )
.GroupBy(x => new { gameDiff = x.Schedule.GameTotal.Value - x.TieBreakerScore.Value })
.Select(g => new { name = g.Key.firstname, count = g.Count(),
gameDiff = Math.Abs(g.Key.gameDiff) })
.OrderByDescending(x => x.count)
.ThenBy(x => x.gameDiff)
.Take(top)
.ToList();
But when I run this I get
System.Data.SqlClient.SqlException: 'Incorrect syntax near the keyword 'AS'.'
System.Data.SqlClient.SqlException
HResult=0x80131904
Message=Incorrect syntax near the keyword 'AS'.
Source=Core .Net SqlClient Data Provider
StackTrace:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.BufferlessMoveNext(DbContext _, Boolean buffer)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
at System.Collections.Generic.List`1.AddEnumerable(IEnumerable`1 enumerable)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at GetWeeklyWinners(Int32 week, Int32 season, Int32 top) in line 23
at ValuesController.test() in line 54
at Microsoft.Extensions.Internal.ObjectMethodExecutor.<>c__DisplayClass33_0.<WrapVoidMethod>b__0(Object target, Object[] parameters)
at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.VoidResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext()
Is Math.Abs not supported or do I have to do it differently?
Here is the sql statement (a couple more fields then what was in my example)
exec sp_executesql N'SELECT TOP(@__p_0) COUNT(*) AS [count], ABS([x.Schedule].[GameTotal] - [x].[TieBreakerScore] AS [gameDiff]) AS [gameDiff]
FROM [Picks] AS [x]
INNER JOIN [Schedules] AS [x.Schedule] ON [x].[ScheduleId] = [x.Schedule].[Id]
GROUP BY [x.Schedule].[GameTotal] - [x].[TieBreakerScore]
ORDER BY [count] DESC, [gameDiff]',N'@__p_0 int',@__p_0=5
big this is that it is translating it to
ABS([x.Schedule].[GameTotal] - [x].[TieBreakerScore] AS [gameDiff]) AS [gameDiff]
so has an extra "as" in it.
Pick class
public class Pick
{
public int Id { get; set; }
public virtual Schedule Schedule { get; set; }
public int ScheduleId { get; set; }
public virtual Team TeamChoice { get; set; }
public int TeamChoiceId { get; set; }
public int? TieBreakerScore { get; set; }
public virtual Employee Employee { get; set; }
public virtual string EmployeeId { get; set; }
public DateTime LastUpdated { get; set; }
}
AS
command is used to rename a column with an alias, so I doubt it has to do withMath.Abs
. Have you tried using aliases other thanname
andcount
in yourSelect
statement? Those seem like they could be problematic, but I don't know – TricksyPicks.TieBreakerScore
(astieBreakerScore
) come from? It's not mentioned anywhere in the query. Is it defined as some sort of computed property? Check your model for oddities. – CabassetPicks
class? – GoogolplexMath.Abs
call into theGroupBy
(around the subtraction expression)? – ChancellorPick
class? – Googolplexnew {...}
appears to be unnecessary for a single column. can you tryx => x.Schedule.GameTotal.Value - x.TieBreakerScore.Value
? That might be why it's adding the extra alias. (Really just stabbing in the dark here... this appears to be a bug in EF Core.) – ChancellorOVER
clause. None of these is available through an ORM – Reliant