2

ファーストネーム、ラストネーム、ストリート、サーチフィールドなどのフィールドを持つデータベースがあります。検索フィールドに一致するものはすべて、ここの検索サブセットに含まれます。これはlinqロジックです。

if (!String.IsNullOrEmpty(searchString))
{
  folders = folders.Where(p => p.SearchField.ToLower().Contains(searchString.ToLower()));
}

名前や名などで注文できます。

ここで、検索語に関連して名前フィールドを優先するように結果を表示したいと思います。

たとえば、Schmidを探す場合、最初にSchmidに一致するLastNameを持つ人々、次に名、次に通りを表示したい...など

何か案が ?

4

2 に答える 2

3

正しく理解できたと思います

var res = 
    folders
        .Where(item => item.FirstName == name)
        .Union(folders.Where(item => item.LastName == name))
        /* Add more Union-Where statements */
        ;
于 2012-10-02T14:41:34.953 に答える
1

最善のアプローチは、最初に一致するオブジェクトを取得してから、メモリ内で続行することだと思います。

var lower = searchString.ToLower();
folders = folders
          .Where(p => p.SearchField.ToLower().Contains(lower))
          .ToArray();
folders = folders
            .OrderBy(f => !f.LastName.Contains(lower))
            .ThenBy(f => !f.FistName.Contains(lower))
            .ThenBy(f => !f. ...

クエリですべてのOrderBy'をIQueryable実行すると、クエリが爆発する可能性がありますが、データベースエンジンを使用するために最初のフィルタが最も重要です。

両方に一致するアイテムが存在する可能性があるため一致するアイテムと一致lowerするアイテムなどを常に表示できるとは限らないことに注意してください。複製したくないと思いますよね?LastNameFistName

于 2012-10-02T14:52:19.390 に答える