2009-08-24 43 views
4

这是我现在有一个非常基本的搜索:LINQ关键字搜索与排序依据基于计数(LINQ到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); 

我知道我可以在。载有(添加)或类似并从关键字框中输入关键字(拆分为单个项目),并获得结果列表。

但是我需要通过基本相关性来排序结果。这意味着如果记录A包含2个关键字(在'Body'nvarchar(MAX)字段中),它应该高于仅匹配1个关键字的记录B.我不需要对每一次击球进行全面统计......但是,如果这是一个eaiser来管理的话就没问题。

那么有没有什么办法直接在命令中直接得到命中数呢?我可以通过获取结果和解析来管理它,但是我真的不想这么做,因为解析可能有数千个人可能突破IIS机器,而SQL Server是一个体面强大的集群:)

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

回答

2

如果我正确理解你,你想打电话OrderyByDescending(p => p.Body),但它应该按p.Body中某个单词appreas的次数来排序?

那么你应该能够创建一个计算的出现,并返回计数,那么你可以简单地做OrderyByDescending(p => CountOccurences(p.Body))

您也可以创建一个BodyComparer类,它实现的IComparer,然后将它传递的方法到OrderByDescending

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

+0

如果我创建一个自定义功能在里面添加,然后它会在Web服务器上本地解析每条记录而不是一个SQL查询是否正确? – 2009-08-24 14:37:34

+0

没错。你正试图通过LINQ OrderBy方法来实现这一点,我现在了解你吗? – 2009-08-24 14:40:06

+0

是啊:)我到目前为止所能想到的可能是一组动态子查询每个关键字来获得计数orderby ...这似乎凌乱嘿 – 2009-08-24 14:42:37

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; 
}