2013-08-14 4 views
19

Ich möchte Daten aus der Datenbank in verschiedenen Tabellen nach Beziehung abrufen, aber ich bekomme einen Fehler, den ich nicht weiß, wie zu behandeln ist .So behandeln Sie Fehler "Methode 'First' kann nur als eine abschließende Abfrageoperation verwendet werden"

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(); 

Unbehandelte Ausnahme: System.NotSupportedException: Die Methode 'First' kann nur als letzte Abfrageoperation verwendet werden. Ziehen Sie in diesem Fall stattdessen die Methode 'FirstOrDefault' in Betracht.

Das Problem ist mit der .First() Methode, aber wenn ich es entferne, kann ich nicht zu einer anderen Tabelle übergeben.

+1

http://stackoverflow.com/questions/7811544/why-does-ef-throw-notsupportedexception-the-method -first-kann-nur-verwendet-als? rq = 1 – Eugene

+0

Ich bin mir nicht sicher, was Ihre Datenbankstruktur ist, aber es scheint, als ob etwas logisch falsch mit Ihrer Abfrage ist. Würden c.InvoiceItems nicht schon diejenigen sein, bei denen InvoiceItem.InvoiceId = Invoice.InvoiceId? Wenn Sie diese Beziehung bereits definiert haben, scheint Ihre Verwendung von Where redundant. Möchten Sie wirklich den Produktnamen nur des ersten Artikels in jeder Rechnung, die der Kunde hat? – hatchet

Antwort

27

Ihre Lösung, wie der Fehler angibt - FirstOrDefault zu verwenden. Dies wird jedoch null zurückgeben, wenn das Ergebnis der ProductName Abfrage leer ist, was bedeutet, dass Sie eine NullReferenceException von FirstOrDefault().Product.ProductsName.Name erhalten würden. Dies wird erreicht, indem die Eigenschaft Transformation früher in der Abfrage, vor dem Aufruf von FirstOrDefault() gelöst:

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(); 
0

Der Fehler wird angezeigt, dass Sie FirstOrDefault() statt First()

nicht sicher, was die Frage ist

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; 

Natürlich wird wirft dies auf einen Fehler verwenden sollen, wenn es keine Elemente aus Ihrer Abfrage ist (NullReferenceException)

+0

Die * Berücksichtigung *, ist bestenfalls ungültig. Der Block 'FirstOrDefault() .Product' ist ein Rezept für eine' NullReferenceException'. Ich würde sagen, dass die von 'First()' geworfene Ausnahme viel genauer ist. –

+1

@TheSolution Ich stimme Ihnen zu, weshalb ich nicht sicher bin, woher der Vorschlag kam – Sayse

+1

Aber das Problem ist anders Ich denke, es könnte das Sprachkonstrukt für Linq Query Ausdruck sein, die Sie nicht zuerst verwenden können() beim Erstellen eines Where Klausel. "Wo" benötigt einen Wert zum Vergleichen, keine mögliche Ausnahme. – vendettamit

Verwandte Themen