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 に答える