2012-07-04 24 views
8

Tôi thực hiện truy vấn sql trả về tên chuỗi dịch vụ. đây là truy vấn:Tôi làm cách nào để chuyển đổi IQueryable <string> thành chuỗi?

IQueryable<string> query = from Comp in ServiceGroupdb.ServiceGroupes 
          where (Comp.GroupID == groupID) 
          select Comp.Name; 

Làm thế nào để tôi nhận được chuỗi đó khỏi truy vấn?

+0

Tại sao bạn tuyên bố câu trả lời là IQueryable nếu bạn chỉ mong đợi một câu trả lời duy nhất? Có nhiều chuỗi được coi là lỗi không? Nếu bạn đang mong đợi nhiều câu trả lời sau đó chuyển đổi thành một mảng khác, hãy rõ ràng trong truy vấn của bạn và thay đổi nó để trả về một chuỗi. – Lazarus

+0

im mong đợi để có được một chuỗi như là kết quả – thechmodmaster

+0

nhưng khi tôi làm: string name = từ Comp trong ServiceGroupdb.ServiceGroupes nơi (Comp.GroupID == groupID) chọn Comp.Name; – thechmodmaster

Trả lời

31

LINQ luôn trả về một chuỗi, vì vậy bạn phải truy xuất mục đó. Nếu bạn biết rằng bạn sẽ chỉ có một kết quả, hãy sử dụng Single() để truy xuất mục đó.

var item = (from Comp in ServiceGroupdb.ServiceGroupes 
      where (Comp.GroupID == groupID) 
      select Comp.Name).Single(); 

Có bốn phương pháp LINQ để lấy một mục duy nhất ra khỏi một chuỗi:

  • Single() trả về mục, ném một ngoại lệ nếu có là 0 hoặc nhiều hơn một mục trong trình tự.
  • SingleOrDefault() trả về mặt hàng hoặc giá trị mặc định (null cho string). Ném nếu có nhiều mục trong chuỗi.
  • First() trả về mục đầu tiên. Ném nếu có 0 mục trong chuỗi.
  • FirstOrDefault() trả về mục đầu tiên, hoặc giá trị mặc định nếu không có mục)
+0

Có thể xác nhận nó hoạt động trong giải pháp của tôi. Cảm ơn bạn! – JPK

7

Để có được phần tử đầu tiên trong truy vấn của bạn, bạn có thể sử dụng query.First() nhưng nếu không có các yếu tố, điều đó sẽ ném một ngoại lệ . Thay vào đó, bạn có thể sử dụng query.FirstOrDefault() sẽ cung cấp cho bạn chuỗi đầu tiên hoặc giá trị mặc định (null). Vì vậy, đối với truy vấn của bạn, thao tác này sẽ hoạt động:

var myString = (from Comp in ServiceGroupdb.ServiceGroupes 
       where Comp.GroupID == groupID 
       select Comp.Name) 
       .FirstOrDefault(); 
5

Bạn sắp hoàn tất.

Chỉ cần làm

IQueryable<string> query = from Comp in ServiceGroupdb.ServiceGroupes where (Comp.GroupID == groupID) select Comp.Name; 
// Loop over all the returned strings 
foreach(var s in query) 
{ 
    Console.WriteLine(s); 
} 

Hoặc sử dụng query.FirstOrDefault() như đã đề cập như bạn sẽ chỉ nhận được một kết quả.

1

tôi tìm ra methods'way đẹp hơn và rõ ràng hơn, vì vậy ở đây nó đi:

string query = ServiceGroupdb.ServiceGroupes 
       .Where(Comp => Comp.GroupID == groupID) 
       .Select(Comp => Comp.Name) 
       .FirstOrDefault(); 
-1

Chỉ cần làm điều đó như thế này;

var query = from Comp in ServiceGroupdb.ServiceGroupes where (Comp.GroupID == groupID) select Comp.Name; 

truy vấn sau đó sẽ chứa kết quả của bạn.

+0

đây không phải là câu trả lời, chỉ cần cùng một mã trong một phong cách khác nhau –

+0

Anh ấy không cần phải sử dụng bất kỳ phong cách khác nhau. Truy vấn của ông sẽ mang lại một chuỗi và biến này sẽ lưu trữ biến đó. Nếu bạn có thể đọc kỹ những gì mình đã nói. "trả về một chuỗi - tên dịch vụ".Cho nên anh ta không cần bất kỳ vòng lặp foreach nào, bởi vì nó chỉ là một giá trị. –

+1

where khoản trả về IQueryable ... khác biệt duy nhất từ ​​mã OP là việc sử dụng var – Alex

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