Penso che sto attualmente riscontrando un bug in Entity Framework 6 e possibilmente ADO.NET. Dato che c'è una scadenza, non sono sicuro di poter aspettare che il bug venga risolto e spero che qualcuno possa aiutarmi a risolvere il problema.
Il problema è che la query utilizza i valori 1 e 5 nei punti in cui dovrebbe essere 0,01 e 0,05. Comunque stranamente 0.1 sembra funzionare
La query generata attualmente è: (ottenuta da SQL Server Profiler)
declare @p3 dbo.someUDT
insert into @p3 values(NULL,5)
insert into @p3 values(5,0.10)
insert into @p3 values(NULL,1)
insert into @p3 values(1,2)
exec sp_executesql N'Select * from @AName',N'@AName [dbo].[someUDT] READONLY',@AName=@p3
Mentre il codice corretto sarebbe:
declare @p3 dbo.someUDT
insert into @p3 values(NULL,0.05)
insert into @p3 values(0.05,0.10)
insert into @p3 values(NULL,0.01)
insert into @p3 values(0.01,0.02)
exec sp_executesql N'Select * from @AName',N'@AName [dbo].[someUDT] READONLY',@AName=@p3
Ho già creato un problema su github qui: tabella definita dall'utente che inserisce un valore errato
Voglio utilizzare una tabella definita dall'utente nella mia query con parametri, questa domanda spiega come eseguire questa operazione: Parametro valore tabella tabella stored procedure Entity Framework
Questo è il codice C # utilizzato per ottenere il codice SQL sopra
DataTable dataTable = new DataTable();
dataTable.Columns.Add("value1", typeof(decimal));
dataTable.Columns.Add("value2", typeof(decimal));
dataTable.Rows.Add(null,0.05m);
dataTable.Rows.Add(0.05m,0.1m);
dataTable.Rows.Add(null,0.01m);
dataTable.Rows.Add(0.01m,0.02m);
List<SqlParameter> Parameters = new List<SqlParameter>();
Parameters.Add(new SqlParameter("@AName", SqlDbType.Structured) { Value = dataTable , TypeName= "dbo.someUDT" });
dbContext.Database.ExecuteSqlCommand("Select * from @AName", Parameters.ToArray());
E codice SQL per ottenere la tabella definita dall'utente
CREATE TYPE [dbo].[someUDT] AS TABLE
(
[value1] [decimal](16, 5) NULL,
[value2] [decimal](16, 5) NULL
)
EDIT:
Gert Arnold l'ha capito. Sulla base della sua risposta, ho trovato un rapporto esistente qui. La colonna TextData di SQL Server Profiler gestisce gli input decimali in modo errato
Select * from @AName
è come segnaposto. In realtà mi sto unendo al tavolo in una query più grande che non pensavo fosse rilevante per la domanda poiché questo già replica il problema in un formato più semplice.
Database.SqlQuery
(anziché Database.ExecuteSqlCommand
) ricevo i valori corretti nel client!
dataTable.Rows.Add(null,0.05m);
e controllare quale query genera