2013-04-30 79 views
1

我将一个字符串传递给控制器​​,并且需要控制器在我的数据库的Title字段内搜索传递的任何单词。在Linq查询中搜索任何词

例如。 ID =“前景错误消息”

[HttpPost] 
    public JsonResult Lookup(string id) 
    { 
     List<string> listOfSearch = id.Split(' ').ToList(); 
     var results = db.KS.Where(x => x.Title.Intersect(listOfSearch).Any()); 

这将产生以下两个错误:

实例论证:不能从“字符串”转换为“System.Linq.IQueryable<string>

‘字符串’中不包含'Intersect'的定义和最佳延伸方法过载'System.Linq.Queryable.Intersect<TSource>(System.Linq.IQueryable<TSource>, System.Collections.Generic.IEnumerable<TSource>)'有一些无效参数

Ca任何人都请告知有什么不对,或者如何用包含任何传入单词的标题列表填充结果?

谢谢,马克

+0

我有A S不久前的类似问题:http://stackoverflow.com/questions/16215100/linq-to-entities-orderby-statement-involving-extension-method(它对您遇到的问题有一个答案) – HennyH 2013-04-30 10:58:43

回答

2
var results = db.KS.Where(x => listOfSearch.Any(item => x.Title.Contains(item))); 

更新
对于LinqToSql:

var titles = db.KS.Select(item => item.Title) 
    .AsEnumerable() 
    .Where(title => listOfSearch.Any(word => title.Contains(word))); 
+0

嗨 - 这看起来像它会工作 - 但如果我通过“展望错误...”它只会返回具有“展望错误..”具体,而不是“展望”或“错误”的项目 - 你知道吗如何实现该请求?谢谢你,马克 – Mark 2013-04-30 13:53:54

+0

对不起我的错误 - 它确实有效 - 这是Twitter TypeAhead,它只是在所有文本出现的时候才会显示出来。这是另一个问题,但:)谢谢你,马克 – Mark 2013-04-30 14:09:57

1

更改声明:

db.KS.Intersect(.... 

KS返回你可以在其上直接进行交叉处的IQueryable的。

+0

这不为这个问题提供一个答案。要批评或要求作者澄清,请在其帖子下方留言。 – 2013-04-30 11:23:47

+0

@RogerRowland,从修辞问题转变为简单的答案。 – Biswanath 2013-04-30 11:27:00

+0

你能否给你的答案多一点实质,让它更有价值? – 2013-04-30 11:31:09

2

你可以尝试

List<string> listOfSearch = id.Split(' ').ToList(); 
var result = from item in db.KS 
       where listOfSearch.Any(v => item.Title.Contains(v)) 
       select item; 

var result = db.KS.Where(item => listOfSearch.Any(v => item.Title.Contains(v)));