2012-04-16 27 views
8

Có một vài câu hỏi khác tương tự như vậy nhưng không ai trong số họ dường như làm những gì tôi đang cố gắng làm. Tôi muốn vượt qua trong một danh sách các chuỗi và truy vấnLINQ có hương vị IS IN Truy vấn

SELECT ownerid where sysid in ('', '', '') -- i.e. List<string> 

hoặc như

var chiLst = new List<string>(); 
var parRec = Lnq.attlnks.Where(a => a.sysid IN chiList).Select(a => a.ownerid); 

Tôi đã được chơi đùa với a.sysid.Contains() nhưng đã không thể để có được bất cứ đâu.

+1

+1 nếu bạn nghĩ rằng cần có câu trả lời đầu tiên cho câu hỏi của bạn bởi Jon Skeet Huy hiệu lol –

Trả lời

11

Contains là con đường phía trước:

var chiLst = new List<string>(); 
var parRec = Lnq.attlnks.Where(a => chiList.Contains(a.sysid)) 
         .Select(a => a.ownerid); 

Mặc dù bạn muốn được tốt hơn off với một HashSet<string> thay vì một danh sách, về hiệu suất, cho tất cả các chứa kiểm tra. (Đó là giả định sẽ có khá nhiều mục nhập ... cho một số lượng nhỏ giá trị, nó sẽ không tạo ra nhiều khác biệt theo cách nào, và List<string> thậm chí có thể nhanh hơn.)

Lưu ý rằng khía cạnh hiệu suất là giả định bạn đang sử dụng LINQ to Objects cho điều này - nếu bạn đang sử dụng một cái gì đó như LINQ to SQL, nó sẽ không quan trọng như kiểm tra Contains sẽ không được thực hiện trong quá trình anyway.

+0

+1. 5 votes trong một phút, congrats :) – mellamokb

+3

Đối với một cái gì đó giống như LINQ to SQL, HashSet sẽ không tạo ra bất kỳ sự khác biệt nào, vì nó chỉ lấy tất cả các phần tử của danh sách và tạo mệnh đề IN. – RobSiklos

+0

@Jon Skeet Sự khác nhau khi sử dụng HashSet Jon là gì? –

1

Bạn sẽ không gọi a.sysid.Contains; cú pháp cho IN (SQL) là đảo ngược của cú pháp cho Contains (LINQ)

var parRec = Lnq.attlnks.Where(a => chiList.Contains(a.sysid)) 
         .Select(a => a.ownerid); 
1

Ngoài các cách tiếp cận Contains, bạn có thể join:

var parRec = from a in Lnq.attlnks 
      join sysid in chiLst 
       on a.sysid equals sysid 
      select a.ownerid 

Tôi không chắc liệu này sẽ làm tốt hơn Contains với một HashSet, nhưng ít nhất nó sẽ có hiệu suất tương tự. Nó chắc chắn sẽ làm tốt hơn việc sử dụng Contains với một danh sách.

+0

Giả sử LINQ to Objects, về cơ bản nó sẽ xây dựng một 'HashSet ' trong quá trình thực hiện kết nối. (Và nó sẽ nhanh hơn 'Danh sách ' * nếu danh sách phát triển lớn * - nếu danh sách rất ngắn, thì việc triển khai dựa trên băm có thể chậm hơn, vì nó cần tạo ra giá trị băm của mục tiêu trước. là tất cả các loại biến trong chơi, thực sự.) –