Quando utilizzo due condizioni unite da un OR
, il risultato non è corretto per SQL Server.
Come posso ripararlo?
Questo è il mio codice LINQ e il risultato in SQL (quella riflessione creata per me):
query.Where(p => ((p.Code == "100000") Or p.Code.EndsWith("200")))
query.Where(p => (p.year == "2015"))}
Ho aggiunto questo where
la clausola in fase di esecuzione, ora aggiungere un altro metodo di estensione e non sta funzionando:
query.sum(p => p.value)
Eccezione:
Un'eccezione di tipo "System.Data.SqlClient.SqlException" si è verificata in Microsoft.EntityFrameworkCore.dll ma non è stata gestita nel codice utente
Informazioni aggiuntive: un'espressione di tipo non booleano specificato in un contesto in cui è prevista una condizione, vicino a "AND".
Tradotto SQL:
SELECT SUM([e].[Value])
FROM [acc].[Data161] AS [e]
WHERE (CASE
WHEN RIGHT([e].[Code], LEN(N'201')) = N'201'
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END |
CASE
WHEN RIGHT([e].[Code], LEN(N'199')) = N'199'
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END)
AND ([e].[SetadCode] = N'161')
L'SQL corretto dovrebbe avere = 1
prima di AND
.
Ma senza una somma funziona bene e aggiungi un comando = 1
a SQL
Prima di tutto, l' Or
non è un operatore C # valido
.Where(p => ((p.Code == "100000") Or p.Code.EndsWith("200")))
Se lo cambi a ||
, la query si traduce correttamente ed esegue il problema.
Guardando l'SQL generato, sono abbastanza sicuro che tu abbia usato l'operatore bit per bit o ( |
) invece, nel qual caso ottengo lo stesso errore. Anche se questo potrebbe essere un bug del traduttore EF Core, non dovresti comunque usarlo - usa il logico o ||
l'operatore e l'SQL generato non avranno tutte le espressioni CASE WHEN
, ma le tipiche condizioni WHERE
semplici.
Puoi usare ||
invece di or
query.Where(p => ((p.Code == "100000") || p.Code.EndsWith("200")))