2009-06-07 28 views
5

Tôi có một phương pháp mở rộng mà là vụ để lọc một đối tượng queryable (IQueryable) dựa trên một tập hợp các Id ....stack tràn trong LINQ to SQL và chứa từ khóa

Lưu ý rằng IQueryable có nguồn gốc từ của tôi cơ sở dữ liệu thông qua một yêu cầu LinqToSql

public static IQueryable<NewsItemSummary> WithID(this IQueryable<NewsItemSummary> qry, IQueryable<Guid> Ids) 
    { 
     return from newsItemSummary in qry 
       where Ids.Contains(newsItemSummary.ID) 
       select newsItemSummary; 
    } 

Nếu Id được tạo ra từ một mảng hoặc danh sách và thông qua tại như một danh sách queryable, nó không làm việc

Ví dụ ...

GetNewsItemSummary().WithID(ids.AsQueryable<Guid>()) 

Nếu Ids được tạo thành một yêu cầu LinqToSql, nó hoạt động !!

này được biết đến vấn đề: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=355026

My Id bộ sưu tập không thể xuất phát từ một yêu cầu LinqToSql ...

Lưu ý, nếu tôi thay đổi chức năng để nó tiêu thụ và IList chứ không phải là một IQueryable .. ..

public static IQueryable<NewsItemSummary> WithID(this IQueryable<NewsItemSummary> qry, IList<Guid> Ids) 
    { 
     return from newsItemSummary in qry 
       where Ids.Contains(newsItemSummary.ID) 
       select newsItemSummary; 
    } 

bây giờ tôi có được ngoại lệ sau đây:

Method 'Boolean Contains(System.Guid)' has no supported translation to SQL. 

Vì vậy, ... tất cả những gì tôi muốn làm là lọc bộ sưu tập tin tức của tôi dựa trên danh sách hoặc mảng của Guids .... Ý tưởng ???

+0

Để bạn biết, thẻ "stackoverflow" thường dành cho các câu hỏi meta, trong khi thẻ "stack-overflow" tốt hơn cho các luồng tràn thực sự. – Zifre

Trả lời

11

Điều này sẽ dịch.

public static IQueryable<NewsItemSummary> WithID(
    this IQueryable<NewsItemSummary> qry, 
    List<Guid> Ids 
) 
    { 
     return from newsItemSummary in qry 
       where Ids.Contains(newsItemSummary.ID) 
       select newsItemSummary; 
    } 
) 

Dịch các phương pháp có sẵn trong quá trình phát triển của LINQ thành sql cho .net 3.5, vì vậy có một số trường hợp bạn mong đợi công việc không - như vậy như bản dịch của IList<T>. Ngoài ra, hãy lưu ý rằng trong khi LinqToSql sẽ vui vẻ dịch các danh sách chứa một số lượng lớn các mục (tôi đã thấy nó làm hơn 50.000 phần tử), SQL Server sẽ chỉ chấp nhận 2.100 tham số cho một truy vấn đơn lẻ.

+2

Mặc dù cả câu hỏi và câu trả lời đều không giống như vấn đề của tôi, chúng giúp tôi tìm ra giải pháp, đó là thay đổi 'IList <>' thành 'List <>'. Lame bug ... – craastad