0

イントラネット サイトで単純な検索を実行しており、クエリとの関連性によって結果を並べ替えたいと考えています。

これが私がこれまでに持っているものです。

var customer = from c in db.Customer
               select c;

if (!String.IsNullOrEmpty(searchString))
{
    customer = customer.Where(c => SqlFunctions.StringConvert((double)c.CustomerID).Trim().Equals(searchString)
    || c.CustomerName.ToUpper().Contains(searchString.ToUpper())
    || SqlFunctions.SoundCode(c.CustomerName.ToUpper()) == SqlFunctions.SoundCode(searchString.ToUpper()));
}

switch (s)
{
    case "NameDesc":
        customer = customer.OrderByDescending(c => c.CustomerName);
        break;
    default:
        customer = customer.OrderBy(c => c.CustomerName);
        break;
}

私は Sounds Like を使用しているため、追加の可能な一致が返されるので便利ですが、検索ボックスに入力したものに最も近い一致が結果の最初に表示されるようにしたいと考えています。

OrderBy でクエリを使用してこれを行うことは可能ですか、それとも全文検索を使用する必要がありますか?

4

1 に答える 1

0

クエリに重みパラメーターを追加してみてください。

customersLevel1 = customer
.Where(c => SqlFunctions.StringConvert((double)c.CustomerID).Trim().Equals(searchString))
.Select(c => new { cust = c, weight = 1});

customersLevel2 = customer
.Where(c => c.CustomerName.ToUpper().Contains(searchString.ToUpper()))
.Select(c => new { cust = c, weight = 2});

customersLevel3 = customer
.Where(c => SqlFunctions.SoundCode(c.CustomerName.ToUpper()) == SqlFunctions.SoundCode(searchString.ToUpper()))
.Select(c => new { cust = c, weight = 3});

次に、DB への 1 つのクエリでデータを取得するには、Union() を使用できます。

var result = (customersLevel1)
             .Union(customersLevel2)
             .Union(customersLevel3)
             .OrderBy(c => c.weight)
             .Select(c => c.cust);
于 2013-10-11T17:54:18.667 に答える