0

以前在 SQL 中,我会使用这样的东西来对我的搜索结果进行排名:

        --search product name
    SELECT tblProduct.ProductID, 20 AS Ranking
    FROM tblProduct
    INNER JOIN tblManufacturer ON tblProduct.ManufacturerID=tblManufacturer.ManufacturerID
    LEFT OUTER JOIN tblProductCollection ON tblProduct.CollectionID=tblProductCollection.CollectionID
    WHERE tblManufacturer.Name + ISNULL(' ' + tblProductCollection.CollectionName, '') + ' ' + tblProduct.Name LIKE '%' + @term + '%'  AND tblProduct.Active = 1
    UNION ALL

    --search product exact name
    SELECT tblProduct.ProductID, 200 AS Ranking
    FROM tblProduct WHERE Name = '%' + term  AND tblProduct.Active = 1
    UNION ALL

此示例说明如果您的搜索词包含在名称中:20 是排名,如果您完全匹配名称:200 是排名。将表格联合在一起,按排名(降序)排序,嘿,快!

这次我正在尝试在 LINQ 中执行此操作,但不确定如何执行此操作,老实说,我不确定我之前的示例是否是最初执行此操作的最佳方法。

因此,我有一个映射到我的数据库的产品实体,并且我在我的部分类中添加了一个名为 SearchRanking 的属性:

            var query = from p in db.Products
                    where p.Name.Contains(term)
                    select p;

        var query2 = from p in db.Products
                     where p.Name.ToLower() == term
                     select p;

不知何故,我需要像这样设置属性:

            var query = from p in db.Products
                    where p.Name.Contains(term)
                    select p, p.SearchRanking = 20;

        var query2 = from p in db.Products
                     where p.Name.ToLower() == term
                     select p, p.SearchRanking = 200;

我在正确的轨道上吗?

4

2 回答 2

1

我会做这样的事情;

        var query = (from p in db.Products
                    where p.Name.Contains(term)
                    select p).ToList().ForEach(p => p.SearchRanking = 20);

一种更有效的方法是;

        var query = (from p in db.Products
                    where p.Name.Contains(term)
                    select new Product
                    {
                        Id = p.Id,
                        //set the other props here
                        SearchRanking = 20
                    }).ToList();
于 2012-08-14T15:38:00.867 回答
1

如果你想创建一个新的匿名类型,你可以这样做:

 var foundProducts = (from p in products
                                 where p.Name.Contains(term)
                                 select new Product  
                                     {
                                         ProductId = p.ProductId,
                                         Category =  p.Category,
                                         Brand =  p.Brand,
                                         SearchRanking = p.Name.ToLower() == term ? 200 : 20
                                     }).OrderBy(s => s.SearchRanking).Take(20);
于 2012-08-14T15:39:20.697 回答