2009-06-07 37 views
5

我這是爲了篩選基於ID的集合可查詢的對象(IQueryable的)的擴展方法....堆棧溢出的LINQ to SQL和包含關鍵字

注意IQueryable的是從我的來源經由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; 
    } 

如果IDS從數組或列表被創建並傳過來的可查詢列表,它不工作

例如...

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

如果ID由一個LinqToSql請求組成,它是否工作!

這是已知的問題: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=355026

我的IDS收集不能來自LinqToSql請求......

注意,如果我改變了功能,因此它消耗和IList的,而不是一個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; 
    } 

我現在得到以下異常:

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

所以...我想要做的就是根據Guid的列表或數組過濾我的新聞集合....想法?

+0

大家知道,「stackoverflow」標籤通常用於元問題,而「stack-overflow」標籤更適合實際的堆棧溢出。 – Zifre 2009-06-07 15:57:17

回答

11

這將翻譯。

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

翻譯包含對本地收藏方法是在LINQ的發展添加到SQL爲.NET 3.5的最後一個功能,所以有一些情況下,你會期望不工作 - 這樣的作爲翻譯IList<T>

另外,請注意,雖然LinqToSql將愉快地轉換包含大量項目的列表(我已經看到它包含超過50,000個元素),但SQL Server將只接受2,100個單個查詢參數。

+2

雖然問題和答案都不完全像我的問題,但他們幫助我找出解決方案,即將我的IList <>`s更改爲List <>。跛腳蟲... – craastad 2013-03-27 17:44:00