2010-09-27 22 views
6

Tôi đang cố gắng tạo một câu lệnh LINQ to SQL để lọc các kết quả trong đó ID là không phải là trong một số danh sách các số nguyên. Tôi nhận ra Chứa() phương pháp không thể được sử dụng trong LINQ to SQL nhưng nhằm mục đích giải thích những gì tôi muốn làm, đây là những gì tôi muốn làm:LINQ to SQL trong đó ID không có trong some_list

nextInvention = (from inv in iContext.Inventions 
        where !historyList.Contains(inv.Id) 
        orderby inv.DateSubmitted ascending 
        select inv).First<Invention>(); 

Bất kỳ ý tưởng làm thế nào tôi có thể đi về việc này?

Cảm ơn!

Trả lời

16

Containscó thể được sử dụng trong LINQ to SQL ... đó là cách thông thường để thực hiện truy vấn "IN". Tôi có một hồi ức mơ hồ rằng có một số hạn chế, nhưng nó chắc chắn có thể hoạt động. Các hạn chế có thể xung quanh các loại có liên quan ... là historyList a List<T>? Nó có thể không được hỗ trợ cho tùy ý IEnumerable<T>, ví dụ.

Bây giờ, tôi không biết liệu đảo ngược kết quả có hoạt động để cung cấp truy vấn "KHÔNG IN" hay không, nhưng ít nhất cũng đáng thử. Bạn đã thử truy vấn chính xác từ câu hỏi của mình chưa?

Một điểm cần lưu ý: Tôi nghĩ rằng khả năng đọc truy vấn của bạn sẽ được cải thiện nếu bạn đã cố gắng để giữ một khoản mỗi dòng:

var nextInvention = (from inv in iContext.Inventions 
        where !historyList.Contains(inv.Id) 
        orderby inv.DateSubmitted ascending 
        select inv) 
        .First(); 

Cũng lưu ý rằng trong trường hợp này, cú pháp phương pháp được cho là đơn giản:

var nextInvention = iContext.Inventions 
          .Where(inv => !historyList.Contains(inv.Id)) 
          .OrderBy(inv => inv.DateSubmitted) 
          .First(); 
+0

Cảm ơn bạn đời! Hoạt động hoàn hảo. Ngoài ra, tôi đã có nó trên một điều khoản trên mỗi dòng, naivete của tôi là trong đánh dấu stackoverflow^_^Tôi đã không bao quanh mã đúng cách. Chúc mừng dù sao đi nữa :) – basicallydan