LINQ - 除了Contains运算符之外,本地序列不能用于查询运算符的LINQ to SQL实现

时间:2012-12-19 09:26:09

标签: linq linq-to-sql contains iqueryable

这似乎是关于我遇到的最普遍的错误 - 关于它的多个SO帖子都指的是不同的问题 - 这里是一个新问题:)

在枚举以下IQueryable时,我收到上述错误:

N.B。 itemsIQueryable<tblItem>keywordsstring

items = items.Where(p => p.heading.ToLower().Contains(keywords) || 
                         p.description.ToLower().Contains(keywords));

这很令人困惑,因为正如错误所示,当你使用Contains时它应该可以正常工作 - 有谁知道如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

如果keyword是一个支持枚举的集合,那么它应该是另一种方式:

items = items.Where(p => keywords.Contains(p.heading.ToLower()) || 
                         keywords.Contains(p.description.ToLower()));

答案 1 :(得分:1)

如果项目是IQueryable,则错误可能在那里,而与where语句无关。 你可以在添加where语句之前尝试强制枚举吗?

例如,假设您正在尝试使用数据表加入内存列表,那么在评估或枚举查询时您将收到该错误

List<tblCategory> categories = tblCategory.ToList();

IQueryable<tblItem> items = (from r in tblItem 
            join c in categories on r.CategoryID equals c.Id select r);


//    items = items.Where(p => p.heading.ToLower().Contains(keywords) || 
//                             p.description.ToLower().Contains(keywords));



var firstMatch = items.FirstOrDefault();

// The error will be generated here even if the where is remmed out 

答案 2 :(得分:1)

<强>解决

感谢sgmoore的意见 - 它有助于实现这一解决方案:

IQueryable列表分配到IEnumerable列表,在其上运行ToList,然后在列表中使用我的过滤器效果很好。

IEnumerable<tblItems> temp = items.ToList();

temp = temp.Where(p => p.heading.ToLower().Contains(keywords) || 
                     p.description.ToLower().Contains(keywords));

items = temp.AsQueryable();