Float error de preselección LINQ vs Query

dapper linq tsql

Pregunta

Vamos a usar Dapper para usar el marco Entity. Existe este método que debe devolver el número de litros para un Id determinado.

Ejemplo:

|-----|--------|
| Id  | Litres |
|-----|--------|
|  1  | 2.75   |
|-----|--------|
|  1  | 2.113  |
|-----|--------|
|  2  | 1.23   |
|-----|--------|

El resultado debería ser en este caso:

id: 1 SumLitres: 4.863 id: 2 SumLitres: 1.23

En el caso real hay miles de entradas y la precisión de la suma de éstas es diferente cuando se usan dapper y Linq. Podemos aceptar 3 decimales decimales, pero no más bajos que eso.

La consulta apta:

const string query = @"
            SELECT Id, Sum(Litres) as Litres
            FROM Litres
            GROUP BY Id;

La consulta de linq:

context.Litres.Select(x => new { x.Id, x.Litres})
                    .GroupBy(x => x.Id)
                    .AsNoTracking()
                    .ToList() 
                    .Select(g => new { Id = g.Key, Litres = g.Sum(s => s.Litres) })
                    .ToList();

El problema es que los resultados difieren en el segundo decimal y no sé cuál de estas preguntas da el resultado con la mayor precisión.

¿Alguien sabe cómo aumentar la precisión o cuál tiene la más alta?

La columna Litros tiene el tipo de datos: real.

Respuesta aceptada

Es probable que al convertir de SQL Real a .Net Single haya un poco de redondeo: el tipo de datos real del servidor Sql, ¿cuál es el equivalente de C #?

Podría intentar usar SQL sin procesar usando su contexto de entidad: https://msdn.microsoft.com/en-us/library/jj592907(v=vs.113).aspx



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué