2013-08-14 16 views
19

Veritabanındaki verileri farklı tablolarda ilişkiyle almak istiyorum, ancak nasıl kullanacağımı bilmediğim bir hata alıyorum ."Yöntem" hatası nasıl işlenir? İlk 'yalnızca son sorgu işlemi olarak kullanılabilir "

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

işlenmeyen durum: System.NotSupportedException: 'İlk' yöntem yalnızca nihai bir sorgu işlemi olarak da kullanılabilir. Bunun yerine, bu örnekte 'FirstOrDefault' yöntemini kullanmayı düşünün.

Sorun, .First() yöntemiyle ilgilidir, ancak onu kaldırırsam başka bir tabloya geçemiyorum.

+1

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

+0

Veritabanı yapınızın ne olduğundan emin değilim, ama sorgunuzla mantıklı bir şekilde yanlış bir şey var gibi görünüyor. C.InvoiceItems zaten sadece InvoiceItem.InvoiceId = Invoice.InvoiceId? Bu ilişkiyi zaten tanımladıysanız, Nerede kullanımınız gereksiz görünüyor. Ayrıca, müşterinin sahip olduğu her faturadaki ilk öğenin Ürün adını gerçekten istiyor musunuz? – hatchet

cevap

27

Çözümünüz, hata durumları olarak FirstOrDefault numaralı telefonu kullanmaktır. Ancak, ProductName sorgusu sonucu null boşsa, NullReferenceExceptionFirstOrDefault().Product.ProductsName.Name'dan edinebilirsiniz. Bu FirstOrDefault() çağrısı önce, sorguda önceki dönüşümü özelliği hareket çözüldü:

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

hata yerine FirstOrDefault() kullanması gerektiğini belirten bir First()

değil sorunun ne olduğunu emin sorgudan Herhangi bir parça yoksa bu bir hata atar Tabii

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; 

(NullReferenceException)

+0

* Düşünme *, en iyi durumda geçersiz. 'FirstOrDefault(). Product' bloğu 'NullReferenceException' için bir reçete. First() 'tarafından atılan istisnanın çok daha doğru olduğunu söyleyebilirim. –

+1

@TheSolution Seninle aynı fikirdeyim bu yüzden öneri nereden geldiğimden emin değilim – Sayse

+1

Ama sorun farklı sanırım Linq sorgu ifadesi için bir dil oluştururken ilk() kullanamazsın dil yapısı olabilir sanırım fıkra. "Nerede", olası bir istisnayı karşılaştırmak için bir değer gerektirir. – vendettamit

İlgili konular