with subconsultas inner framework linq-to-entities

linq to entities - subconsultas - Cómo manejar el error "El método ''Primero'' solo se puede usar como una operación de consulta final"



subconsultas linq to entities (2)

El error indica que debe usar FirstOrDefault() lugar de First()

No estoy seguro de cuál es la pregunta

int customer_id = int.Parse(this.comboBoxnamecustomer.SelectedValue.ToString()); a = (from c in db.Invoices where c.CustomerID == customer_id select new { customerName=c.Customer.Name,ProductName=c.InvoiceItems.Where(x=> x.InvoiceId==c.InvoiceId).FirstOrDefault().Product.ProductsName.Name }).ToList(); dataGridViekryar.DataSource = a;

Por supuesto, esto generará un error si no hay ningún elemento de su consulta (NullReferenceException)

Quiero recuperar datos de la base de datos en diferentes tablas por relación, pero recibo un error que no sé cómo manejar.

int customer_id = int.Parse(this.comboBoxnamecustomer.SelectedValue.ToString()); a = (from c in db.Invoices where c.CustomerID == customer_id select new { customerName = c.Customer.Name, ProductName = c.InvoiceItems .Where(x => x.InvoiceId == c.InvoiceId) .First().Product.ProductsName.Name }).ToList();

Excepción no controlada: System.NotSupportedException: El método ''Primero'' solo se puede usar como una operación de consulta final. Considere usar el método ''FirstOrDefault'' en esta instancia en su lugar.

El problema es con el método .First() , pero si lo quito no puedo pasar a otra tabla.


Su solución, como indica el error, es utilizar FirstOrDefault . Sin embargo, esto devolverá null si el resultado de la consulta ProductName está vacío, lo que significa que obtendría una NullReferenceException de FirstOrDefault().Product.ProductsName.Name . Esto se resuelve moviendo la transformación de propiedad anteriormente en la consulta, antes de la llamada a FirstOrDefault() :

a = (from c in db.Invoices where c.CustomerID == customer_id select new { customerName=c.Customer.Name, ProductName=c.InvoiceItems.Where(x=> x.InvoiceId==c.InvoiceId) .Select(i => i.Product.ProductsName.Name) .FirstOrDefault() }).ToList();