我有一个扩展方法,该方法应该根据ID的集合来过滤Queryable对象(IQueryable)。

请注意,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列表或数组过滤新闻集。

最佳答案

这将翻译。

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

针对本地集合的Contains方法的翻译是linq到.net 3.5的sql开发中添加的最后一项功能,因此,在某些情况下,您可能会期望工作没有完成,例如IList<T>的翻译。

另外,请注意,尽管LinqToSql会愉快地转换包含大量项目的列表(我已经看到它处理了50,000多个元素),但SQL Server单个查询仅接受2,100个参数。

关于linq - LINQ to SQL和Contains关键字中的堆栈溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/961912/

10-11 06:07