2009-07-05 32 views
33

Vì vậy, tôi đang cố gắng để trở lại một bộ sưu tập của người có ID được chứa trong một bộ sưu tập được tạo ra tại địa phương của id (IQueryable)làm việc xung quanh LinqToSQls "truy vấn với các bộ sưu tập địa phương không được hỗ trợ" ngoại lệ

Khi tôi chỉ định " bộ sưu tập được tạo cục bộ ", tôi có nghĩa là bộ sưu tập Id không đến từ truy vấn LinqToSql và đã được tạo lập trình (dựa trên đầu vào của người dùng). truy vấn của tôi trông như thế này:

var qry = from p in DBContext.People 
        where Ids.Contains(p.ID) 
        select p.ID; 

Điều này làm cho ngoại lệ sau đây ...

"truy vấn với các bộ sưu tập địa phương không được hỗ trợ"

Làm thế nào tôi có thể tìm thấy tất cả các dân với một id mà được chứa trong bộ sưu tập Id được tạo cục bộ của tôi?

Có thể sử dụng LinqToSql không?

Trả lời

34

Nếu Id là Danh sách, mảng hoặc tương tự, L2S sẽ dịch thành một vùng chứa.

Nếu Id là IQueryable, chỉ cần biến nó thành danh sách trước khi sử dụng nó trong truy vấn. Ví dụ:

List<int> listOfIDs = IDs.ToList(); 
var query = 
from st in dc.SomeTable 
where listOfIDs.Contains(st.ID) 
select ..... 
+2

Tôi nghĩ giải pháp cho vấn đề của bạn có nhiều sắc thái hơn câu trả lời này. Tôi đang sử dụng cùng một cấu trúc (một phương thức chứa trên một IQueryable trong một mệnh đề WHERE) thành công, và LINQ to SQL dịch nó thành một mệnh đề WHERE EXISTS trong truy vấn SQL. Dường như nó hoạt động trong một số tình huống và không phải là tình huống khác, vì vậy bạn nên đăng cách bạn nhận được Id của mình IQueryable, vì điều đó có thể làm sáng tỏ một số vấn đề. –

+1

@jmbledsoe nếu câu trả lời của tôi không đủ rõ ràng: L2S mong đợi một IEnumerable cục bộ (không phải là một IQuery có thể trì hoãn) được chuyển tới Enumerable.Contains. Nếu bạn chuyển cho nó một truy vấn cục bộ, thì nó không thể được dịch sang truy vấn SQL. Nếu bạn vượt qua nó một danh sách/mảng/etc thì nó có thể được dịch sang một mệnh đề SQL "where ... in (x, y, ..., n)". – KristoferA

+2

Tôi nghĩ rằng tôi thấy những gì bạn đang nói: - Vượt qua một danh sách/Array/etc. là OK b/c nó sẽ tạo ra một mệnh đề WHERE ... IN. - Vượt qua một IQuery có thể hoãn lại là OK b/c nó sẽ tích hợp với truy vấn bị trì hoãn hiện tại. - Vượt qua một IEnumerable cục bộ là KHÔNG OK, nhưng bạn chỉ có thể .ToList() nó và nó sẽ ổn. –

26

Tôi cũng đang vật lộn với vấn đề này. Giải quyết vấn đề của tôi khi sử dụng Any() thay vì

people.Where(x => ids.Any(id => id == x.ID)) 
+0

@ maxlego Và SQL được tạo ra là gốc. Cảm ơn –

0

Tôi xin lỗi nhưng câu trả lời ở đây không hiệu quả đối với tôi khi tôi đang làm các loại động hơn nữa.

Điều tôi đã làm là sử dụng "UNION" trong vòng lặp hoạt động tuyệt vời. Dưới đây là cách thực hiện:

var firstID = cityList.First().id; 
var cities = dc.zs_Cities.Where(c => c.id == firstID); 
foreach(var c in cityList) 
{ 
    var tempCity = c; 
    cities = cities.Union(dc.zs_Cities.Where(cty => cty.id == tempCity.id)); 
} 
Các vấn đề liên quan