私はレッスンのテーブルを持っています。ただし、検索は注文する必要があります。たとえば、レッスンにKeywords
フィールドとDescription
フィールドがあります。検索は、Keywords
の値よりも優先されるべきです。すべては、優先順位が考慮された後でなければならないが、日付によって順序付けられるべきである。全体的にエンティティフレームワーク内で順序付けられたセットを結合してからスキップします。
string[] word = /*Search words*/
var data = db.LessonsLearneds.Where(dbRecord => words.Any(word =>
dbRecord.SearchKeywords.StartsWith(word + ",") ||
dbRecord.SearchKeywords.Contains("," + word + ",") ||
dbRecord.SearchKeywords.EndsWith("," + word)))
.Select(x => new { Record = x, Order = 1 });
data = data.Union(
db.LessonsLearneds
.Where(dbRecord => words.Any(word => dbRecord.Title.Contains(word)))
.Select(x => new { Record = x, Order = 2 }));
data = data.Union(
db.LessonsLearneds
.Where(dbRecord => words.Any(word => dbRecord.Description.Contains(word)))
.Select(x => new { Record = x, Order = 3}));
data = data.Union(
db.LessonsLearneds
.Where(dbRecord => words.Any(word => dbRecord.Lesson.Contains(word)))
.Select(x => new { Record = x, Order = 4 }));
return data
.Distinct()
.OrderBy(x => x.Order)
.ThenByDescending(x => x.Record.Date)
.Select(x => x.Record)
.ToPagedList(pageNumber, pageSize);
このコード:私もこれは私がこれまで持っているものである
(私はそれだけでページを管理するためにSkip()
とTop()
を使用して考える)https://github.com/troygoode/PagedListから最後にToPagedList()
を使用してい
Distinct()
を除いて、私が欲しいものをほとんどします。ここの各ユニオンは同じレコードを取得することができるので、私はそれを数回受け取るかもしれません。Distinct()
は、仮想Order
フィールドのために一意性を強制しません。
任意のアイデア:私は(The method 'Skip' is only supported for sorted input in LINQ to Entities.
例外で結果を)注文するSelect(x => x.Record)
セットを必要とToPagedList(..)
のため、後にDistinct
を置くことができませんか?
これまでにの後にOrder
フィールドを追加していますが、これは2回Containsチェックを2回書く必要があり、非常に醜い解決策であると思います。