2013-08-14 79 views
19

Tôi muốn lấy dữ liệu từ cơ sở dữ liệu trong các bảng khác nhau theo quan hệ, nhưng tôi nhận được một lỗi mà tôi không biết làm thế nào để xử lý .Làm thế nào để xử lý lỗi "phương pháp 'Đầu tiên' chỉ có thể được sử dụng như một hoạt động truy vấn cuối cùng"

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

Unhandled Exception: System.NotSupportedException: Phương pháp 'đầu tiên' chỉ có thể được sử dụng như một hoạt động truy vấn chính thức. Hãy xem xét sử dụng phương pháp 'FirstOrDefault' trong trường hợp này thay thế.

Vấn đề là với phương pháp .First(), nhưng nếu tôi xóa, tôi không thể chuyển sang bảng khác.

+1

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

+0

Tôi không chắc cấu trúc cơ sở dữ liệu của bạn là gì, nhưng có vẻ như có điều gì khác sai về mặt logic với truy vấn của bạn. Sẽ không c.InvoiceItems đã được chỉ có những nơi InvoiceItem.InvoiceId = Invoice.InvoiceId? Nếu bạn đã xác định mối quan hệ đó, việc sử dụng của bạn ở đâu có vẻ dư thừa. Ngoài ra, bạn có thực sự muốn tên Sản phẩm chỉ là mặt hàng đầu tiên trong mỗi hóa đơn mà khách hàng có không? – hatchet

Trả lời

27

Giải pháp của bạn, như trạng thái lỗi - là sử dụng FirstOrDefault. Tuy nhiên, điều này sẽ trả về null nếu kết quả của truy vấn ProductName trống, nghĩa là bạn sẽ nhận được một NullReferenceException từ FirstOrDefault().Product.ProductsName.Name. Này được giải quyết bằng cách di chuyển tài sản chuyển đổi trước đó trong truy vấn, trước khi cuộc gọi đến 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

Các lỗi được nói rằng bạn nên sử dụng FirstOrDefault() thay vì First()

Không chắc gì câu hỏi là

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; 

Tất nhiên điều này sẽ ném ra một lỗi nếu không có bất kỳ mục từ truy vấn của bạn (NullReferenceException)

+0

* xem xét *, không hợp lệ ở mức tốt nhất. Khối 'FirstOrDefault(). Product' là một công thức cho' NullReferenceException'. Tôi sẽ nói ngoại lệ được ném bởi 'First()' là chính xác hơn nhiều. –

+1

@TheSolution Tôi đồng ý với bạn đó là lý do tại sao tôi không chắc chắn gợi ý đến từ đâu từ số – Sayse

+1

Nhưng vấn đề khác với tôi đoán nó có thể là ngôn ngữ xây dựng cho biểu thức truy vấn LINQ mà bạn không thể sử dụng đầu tiên() khi tạo mệnh đề. "Nơi" yêu cầu một giá trị để so sánh không phải là ngoại lệ có thể. – vendettamit