2013-08-14 17 views
19

Chcę pobrać dane z bazy danych w różnych tabelach według relacji, ale pojawia się błąd, którego nie wiem, jak obsługiwać .Jak radzić sobie z błędami "metoda" Pierwsza "może być użyta tylko jako operacja zapytania końcowego"

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

Nieobsłużone Wyjątek System.NotSupportedException: metoda „pierwszej” może być używane tylko w końcowej operacji zapytania. Zamiast tego należy użyć metody "FirstOrDefault" w tym wystąpieniu.

Problem dotyczy metody .First(), ale jeśli ją usunę, nie mogę przejść do innej tabeli.

+1

http://stackoverflow.com/questions/7811544/why-does-ef-throw-notsupportedexception-the-method -first-can-only-be-used-as? rq = 1 – Eugene

+0

Nie jestem pewien jaka jest twoja struktura bazy danych, ale wydaje się, że jest coś logicznie nie tak z twoim zapytaniem. Czy c.InvoiceItems nie byłyby już tylko tymi, w których InvoiceItem.InvoiceId = Invoice.InvoiceId? Jeśli już zdefiniowałeś ten związek, korzystanie z tego miejsca wydaje się zbędne. Czy naprawdę chcesz również nazwy produktu tylko pierwszego elementu na każdej fakturze, którą posiada klient? – hatchet

Odpowiedz

27

Twoje rozwiązanie, jak podaje stan błędu, polega na użyciu FirstOrDefault. To jednak zwróci null, jeśli wynik zapytania ProductName jest pusty, co oznacza, że ​​uzyskasz NullReferenceException z FirstOrDefault().Product.ProductsName.Name. To jest rozwiązany poprzez przeniesienie własności transformaty wcześniej w zapytaniu przed wywołaniem 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(); 
0

Błąd jest stwierdzając, że należy użyć FirstOrDefault() zamiast First()

Nie wiem, co jest pytanie

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; 

Oczywiście będzie to wygeneruje błąd, jeśli nie ma żadnych przedmiotów z twojego zapytania (NullReferenceException)

+0

Pytanie * jest w najlepszym wypadku nieprawidłowe. Blok 'FirstOrDefault(). Produkt' jest receptą dla' NullReferenceException'. Powiedziałbym, że wyjątek generowany przez 'First()' jest znacznie dokładniejszy. –

+1

@TheSolution Zgadzam się z Tobą, dlatego nie jestem pewien, skąd się wzięła sugestia od – Sayse

+1

Ale problem jest inny Myślę, że może to być konstrukcja językowa dla wyrażenia zapytania Linq, której nie możesz użyć jako pierwszej() podczas tworzenia miejsca klauzula. "Gdzie" wymaga wartości do porównania, a nie możliwego wyjątku. – vendettamit

Powiązane problemy