Nehmen wir an, wir müssen zwei Sätze aus einer Tabelle auswählen: "Dinge"
var GradeA = db.Things.Where(t=> condition1);
var GradeB = db.Things.Where(t=> !condition1 && condition2);
var DesiredList = GradeA.union(GradeB);
alternativ müssen wir eine einzige Anweisung schreiben, um zu vermeiden union
Kosten:
var DesiredList = db.Things.Where(t=> condtion1 || (!condition1 && condition2));
Das Problem ist, dass der Abfrageoptimierer den Ausdruck anscheinend auf Bedingung2 nur.
Wie lässt sich die Priorität zwischen Zustand1 und Bedingung2
ein praktisches Beispiel für eine Umgehung ist :
/// <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}
);
}
Bearbeiten:
Ein Beispiel ist das Abrufen der Auto-Vervollständigen-Liste:
- Eingang:
str
- Ausgabe: Dinge, die mit
str
und Dinge, die Folgendes enthaltenstr
(keine Duplikate)
Ein weiteres Beispiel: Auswahl von ThingTags
die 3 Eigenschaften haben:
ThingID
UserID
TagID
wir wollen nur einen auswählen ThingTag
für jede TagID
unter der Bedingung, dass wir diejenige auswählen, die mit UserID
ist gleich Parameter, wenn existiert , sonst zuerst wählen ThingTag
dafür TagID
.
Immer noch bei mir? Ich hoffe doch :)