LINQ关键字搜索,基于计数的orderby相关性(LINQ to SQL)

时间:2009-08-24 14:12:09

标签: c# .net linq linq-to-sql

这就是我现在作为一个非常基本的搜索:

var Results = from p in dx.Listings select p;
if (CategoryId > 0) Results = Results.Where(p => p.CategoryId == CategoryId);
if (SuburbId > 0) Results = Results.Where(p => p.SuburbId == SuburbId);
var OrderedResults = Results.OrderByDescending(p => p.ListingType);
OrderedResults = OrderedResults.ThenByDescending(p => p.Created);

据我所知,我可以添加一个.Contains()或类似内容,然后从关键字框中输入关键字(拆分成单个项目),这样就可以得到结果列表。

但是我需要按基本相关性排序结果。这意味着如果记录A包含2个关键字(在'Body'nvarchar(MAX)字段中),则它应该高于仅与1个关键字匹配的记录B.我不需要对每一次打击都进行全面计算......但是,如果能够管理那些那就没问题了。

那么有没有办法直接将命中数作为orderby的一部分来获得?我可以通过获取结果和解析来管理它,但是我真的不想这样做,因为解析可能有数千人可能会破坏IIS机器,而SQL Server是一个非常强大的集群:)

如果有人有任何想法或提示,那将是一个很大的帮助。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你想打电话给OrderyByDescending( p => p.Body ),但应该按照某个单词在p.Body中播放多少次来排序?

然后你应该能够创建一个计算事件的方法并返回计数,然后你可以简单地OrderyByDescending( p => CountOccurences(p.Body) )

您也可以创建 BodyComparer 类来实现 IComparer ,然后将其传递给 OrderByDescending

编辑: 看一下这个链接Enable Full Text Searching

答案 1 :(得分:0)

这是一个简单的例子,如果我理解你正在寻找什么:

var storedData = new[]{
    new int[] {1, 2, 3, 4},
    new int[] {1, 2, 3, 4, 5}
};
var itemsFromTextBox = new[] { 3, 4, 5 };

var query = storedData.Where(a => a.ContainsAny(itemsFromTextBox))
    .OrderByDescending(a => itemsFromTextBox.Sum(i => a.Contains(i)? 1:0));

使用以下ContainsAny扩展名:

public static bool ContainsAny<T>(this IEnumerable<T> e1, IEnumerable<T> e2)
{
    foreach (var item in e2)
    {
        if (e1.Contains(item)) return true;
    }
    return false;
}