unario tutorial operadores operador logicos expresiones delegados asignacion c# linq null-coalescing-operator

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).