tutorial - operadores de asignacion en c#
un árbol de expresión lambda no puede contener un operador de propagación nulo (2)
Pregunta
: ¿El
price = co?.price ?? 0,
línea
price = co?.price ?? 0,
price = co?.price ?? 0,
en el siguiente código me da el error anterior.
pero si me quito
?
de
co.?
funciona bien.
Estaba tratando de seguir
este ejemplo de MSDN
donde están usando
?
en línea
select new { person.FirstName, PetName = subpet?.Name ?? String.Empty };
select new { person.FirstName, PetName = subpet?.Name ?? String.Empty };
Entonces, ¿parece que necesito entender cuándo usarlo
?
con
??
y cuando no.
Error :
un árbol de expresión lambda no puede contener un operador de propagación nulo
public class CustomerOrdersModelView
{
public string CustomerID { get; set; }
public int FY { get; set; }
public float? price { get; set; }
....
....
}
public async Task<IActionResult> ProductAnnualReport(string rpt)
{
var qry = from c in _context.Customers
join ord in _context.Orders
on c.CustomerID equals ord.CustomerID into co
from m in co.DefaultIfEmpty()
select new CustomerOrdersModelView
{
CustomerID = c.CustomerID,
FY = c.FY,
price = co?.price ?? 0,
....
....
};
....
....
}
El código al que se vincula utiliza la
List<T>
.
List<T>
implementa
IEnumerable<T>
pero no
IQueryable<T>
.
En ese caso, la proyección se ejecuta en memoria y
?.
trabajos.
Estás utilizando
IQueryable<T>
, que funciona de manera muy diferente.
Para
IQueryable<T>
, se crea una representación de la proyección y su proveedor LINQ decide qué hacer con ella en tiempo de ejecución.
Por razones de compatibilidad con versiones anteriores,
?.
No se puede utilizar aquí.
Dependiendo de su proveedor de LINQ, puede usar plain
.
y todavía no recibe ninguna
NullReferenceException
.
El ejemplo del que estaba citando utiliza LINQ to Objects, donde las expresiones lambda implícitas en la consulta se convierten en
delegados
... mientras que está usando EF o similar, con consultas
IQueryable<T>
, donde las expresiones lambda se convierten en
expresión arboles
Los árboles de expresión no admiten el operador condicional nulo (o tuplas).
Solo hazlo a la antigua:
price = co == null ? 0 : (co.price ?? 0)
(Creo que el operador de fusión nula está bien en un árbol de expresión).