2009-10-12 40 views
5

Không biết những gì sai ở đây, khi tôi chạy ứng dụng nó nói "Specified phương pháp không được hỗ trợ" trỏ vào "var kết quả trong truy vấn" trong foreach loop. Xin vui lòng giúp đỡ ...foreach trong linq kết quả không làm việc

var query = from c in entities.Customer 
      select c.CustomerName; 

List<string> customerNames = new List<string>(); 

foreach (var result in query) 
{ 
    customerNames.Add(result.ToString()); 
} 

EDIT: sử dụng ToList() cũng đưa ra cùng một lỗi.

+0

ở dòng nào? Nơi duy nhất cho lỗi là kết quả. –

+2

"Thực thể" là gì? –

+0

thực hiện một Console.WriteLine (result.ToString()); công việc? –

Trả lời

5

Lý do lỗi của bạn là phạm vi, đó là lỗi "phương pháp không được hỗ trợ" cho bạn biết.

Điều này thường xảy ra khi sử dụng LINQ để [điền vào chỗ trống] ORM. Vì vậy, tôi đoán các thực thể của bạn phải từ một công cụ ORM, giống như Entity Framework, và bạn đang sử dụng một cái gì đó giống như LINQ to Entities.

Khi sử dụng LINQ truy vấn của bạn không được liệt kê cho đến khi bạn truy cập nó, cho ORM nghĩa là nhấn cơ sở dữ liệu hoặc kho dữ liệu khác. Hành động bị trì hoãn này có thể gây ra một số hành vi lạ nếu bạn không biết nó có đó, chẳng hạn như lỗi này.

Nhưng, bạn có mã cục bộ (không phải LINQ) và truy vấn của bạn đan xen, do đó trình biên dịch LINQ to [] không biết cách xử lý mã cục bộ của bạn khi biên dịch mã LINQ. Do đó, lỗi "phương thức không được hỗ trợ" - về cơ bản giống như tham chiếu một phương thức riêng từ bên ngoài lớp, phương thức bạn gọi là không rõ trong phạm vi hiện tại.

Nói cách khác, trình biên dịch đang cố gắng biên dịch truy vấn của bạn và nhấn cơ sở dữ liệu khi bạn thực hiện kết quả.ToString(), nhưng không biết gì về biến riêng tư của CustomerNames hoặc phương thức foreach. Logic cơ sở dữ liệu và logic đối tượng cục bộ phải được giữ riêng biệt - hoàn toàn giải quyết các kết quả truy vấn cơ sở dữ liệu trước khi sử dụng cục bộ.

Bạn sẽ có thể viết nó như thế này:

var customerNames = entities.Customer.Select(c => c.CustomerName).ToList(); 

Nếu bạn có để giữ cho foreach (cho logic phức tạp hơn, không cho đơn giản này của một ví dụ), bạn vẫn cần phải giải quyết LINQ to [] phần (bằng cách buộc nó liệt kê các kết quả truy vấn) trước khi liên quan đến bất kỳ mã không phải là mã LINQ:

var query = from c in entities.Customer 
      select c.CustomerName; 

var qryList = query.ToList(); 

List<string> customerNames = new List<string>(); 

foreach (var result in qryList) 
{ 
    customerNames.Add(result.ToString()); 
} 
+0

Bạn nói đúng là tôi đang sử dụng khung thực thể. Sử dụng giải pháp của bạn Tôi nhận được cùng một lỗi trong dòng này: var qryList = query.ToList(); cảm ơn lời giải thích tốt của bạn. –

2

Bạn có thể thử chỉ sử dụng phương thức ToList() thay vì foreach không?

List<string> customerNames = query.ToList(); 
+0

Đó chắc chắn là con đường để đi nhưng tôi không thể xem nó giải quyết vấn đề thực tế như thế nào. –

+0

Có thể bạn đã đúng, nhưng tôi thấy nó đáng để bắn. – jasonh

+0

Có, đó sẽ là cách phù hợp với danh sách từ truy vấn. Đơn giản nhất có thể. – Gart

0

Hãy thử loại bỏ .ToString() và xem nếu điều này sẽ làm việc:

foreach (var result in query) 
{ 
    customerNames.Add(result); 
} 

Có vẻ như rằng gốc rễ của vấn đề nằm sâu bên trong cơ chế dịch truy vấn LINQ-to-SQL. Tôi cho rằng công cụ dịch sẽ cố gắng dịch .ToString() thành SQL và không thành công ở đó.

+0

Tôi đã thử nhưng vẫn gặp lỗi tương tự. –

0

thử này

var query = from c in entities.Customer 
     select c.CustomerName; 

List<string> customerNames = new List<string>(); 

query.ToList().ForEach(r=>customerNames.Add(r)); 
1

Nếu vấn đề không phải là ToString() như Gart mentioned giảm đáng ngờ thứ hai của tôi trong c.CustomerName. Đây có phải là thuộc tính tùy chỉnh trong lớp học một phần của bạn không?

Ngoài ra, stacktrace của ngoại lệ phải hiển thị một cách tinh tế phương pháp không được hỗ trợ là gì.

Các vấn đề liên quan