テーブルから2つのセットを選択する必要があるとしましょう:「Things」
var GradeA = db.Things.Where(t=> condition1);
var GradeB = db.Things.Where(t=> !condition1 && condition2);
var DesiredList = GradeA.union(GradeB);
unionまたは、コストを回避するために1つのステートメントを作成する必要があります。
var DesiredList = db.Things.Where(t=> condtion1 || (!condition1 && condition2));
問題は、クエリオプティマイザが式をcondition2のみにトリミングしているように見えることです。
condition1とcondition2の間の優先順位を維持する方法
実際の回避策の例は次のとおりです。
/// <summary>
/// Gets only first BookTag for each tag word, chooses the one of this user (if exists).
/// </summary>
/// <param name="book"></param>
/// <returns></returns>
public static IQueryable<BookTag> UniqueByTags(this IQueryable<BookTag> bookTags, User user)
{
return bookTags.GroupBy(BT => BT.TagId)
.Select(g => g.Any(bt => bt.UserId == user.Id) ?
new BookTag() { User = user, Tag = g.First().Tag, Book = bookTags.First().Book } :
new BookTag() {User = g.First().User, Tag = g.First().Tag, Book = bookTags.First().Book}
);
}
編集:
例はオートコンプリートリストを取得することです:
- 入力:
str - 出力:で始まる
strものと含むものstr(重複なし)
別の例:ThingTags3つのプロパティを持つものを選択する:
ThingIDUserIDTagID
存在する場合はパラメータが等しいものを選択するという条件の下でThingTag、それぞれに対して1つだけを選択します。それ以外の場合は、最初に選択します。TagIDUserIDThingTagTagID
まだ私と一緒に ?そう願っています:)