2011-11-07 34 views
20

Tôi đã thử tìm kiếm điều này nhưng không thể tìm thấy các ví dụ phù hợp với tình huống của tôi.LINQ IN Nhà điều hành

Tôi có phương thức này để trả lại khách hàng. Làm thế nào tôi có thể sử dụng mảng chuỗi mã để lọc nó? Chứa không hiệu quả với tôi.

public static List<Customer> GetCustomers(string[] customerCodesArray) 
{ 
    using (busDataContext g = new busDataContext()) 
    { 
     return g.Customers.Where(
      x => x.customerCode.Contains(customerCodesArray)).ToList(); 
    } 
} 
+1

Vui lòng làm rõ "chính xác" không hoạt động ... – Didaxis

+0

Bạn có ý nghĩa gì bởi "không hoạt động"? Bạn có nhận được lỗi biên dịch không? Nếu vậy, lỗi là gì? Hoặc bạn có gặp lỗi thời gian chạy không? Nếu vậy, lỗi là gì? –

+1

có thể trùng lặp của ["Where In" với LINQ to sql] (http://stackoverflow.com/questions/960827/where-in-with-linq-to-sql) – jrummell

Trả lời

31

Hãy thử đoạn mã sau:

return g.Customers.Where(x => customerCodesArray.Contains(x.customerCode)).ToList(); 
+2

Mặc dù về mặt kỹ thuật chính xác, khi sử dụng SQL, đây không phải là giải pháp hoạt động tốt nhất. Nó đòi hỏi phải quét toàn bộ bảng khách hàng và hầu hết có lẽ bên ngoài áp dụng mỗi bản ghi trên mảng mã khách hàng. Sự phức tạp của điều này trở thành O (N * M). Sẽ thực tế hơn nếu sử dụng câu lệnh nối LINQ, do đó truy vấn SQL được tạo có thể sử dụng tham gia. –

+0

@TonniTielens Điều đó hoàn toàn phụ thuộc vào các chỉ mục của cơ sở dữ liệu. Nó sẽ không nhất thiết tạo ra một quét (và nếu nó đã làm, một tham gia sẽ giá vé không tốt hơn, hoặc là). Từ kinh nghiệm của tôi, chèn vào một bảng tạm thời và tham gia chỉ cung cấp các lợi ích hiệu suất khi 'customerCodesArray' chứa hàng nghìn mục. – Rob

20

Bạn đang ngược:

return g.Customers.Where(x => customerCodesArray.Contains(x.customerCode)).ToList(); 
11

Tôi nghĩ rằng bạn cần phải đảo ngược các biểu hiện Contains bởi vì bạn muốn để xem nếu mảng có chứa mã khách hàng, không phải là cách khác xung quanh.

Hãy thử điều này:

return g.Customers.Where(x => customerCodesArray.Contains(x.customerCode)).ToList(); 
3

Tôi đoán đây là những gì bạn muốn

return g.Customers.Where(x => customerCodesArray.Contains(x.customerCode)).ToList(); 
5

Hãy thử

return g.Customers.Where(x=>customerCodesArray.Contains(x.CustomerCode)).ToList();