我有一个字符串数组和一个Linq查询:
/// <summary>
/// Return all the search results
/// </summary>
public static GenericTagEntity[] getSearchResults(int SectionID, string[] Words)
{
GenericTagEntity[] Recs;
using (MainContext db = new MainContext())
{
var q = (
from c in db.tblArticles
join a in db.tblForumAuthors on c.AuthorID equals a.Author_ID
join u in db.tblProfiles on c.AuthorID equals u.UserID
where c.IsDeleted == false
&& c.SectionID == SectionID
select new
{
c.Title,
c.ID,
c.Anchor,
c.Date,
c.Description,
u.EmailAddress,
u.UserID,
a.Username,
c.Body,
comments = (from f in db.tblComments where f.IsDeleted == false && f.Anchor == c.Anchor select new { f.ID }).Count()
});
我想要做的是修改where
,以便返回c.Title
或c.Body
包含一个或多个字词的结果。然后我需要按总比赛排序(最相关的第一个)!
这对我来说真的很难,非常感谢任何帮助。
我发现了这个,但它只是部分有用,SO搜索也没有产生很多结果。 http://msdn.microsoft.com/en-us/library/bb546166.aspx#Y200
答案 0 :(得分:3)
遗憾地打破它给你,但你用错误的工具来解决这个问题。在db中创建全文索引并通过自定义函数从LINQ调用全文搜索,或使用第三方全文搜索系统Lucene。
如果你真的想在sql中这样做,那就算不了。文档中单词的实例将要求您更改数据库模式。
你需要一个单词表(id,word)和一个出现表(wordid,articleid)然后你可以对出现表进行查询以获得你想要的结果。
答案 1 :(得分:3)
我相信这会解决问题
var occurrences = from e in q.Title.Split(new char[] { ' ' }).Concat(q.Body.Split(new char[] { ' ' }))
join word in Words on e equals word
group e by e into g
select new {element = g, count = g.Count()} into result
orderby result.count descending
select result;
查询将生成一个单词列表,这些单词在标题或正文中按发生次数降序排列。