Первое: Я бы на самом деле повторно проверил ваш исходный код на наличие условий, хотя возможно, что в оптимизаторе запросов есть ошибка, скорее всего, была ошибка в используемом выражении, и это действительно не представляю ниже:
var DesiredList = db.Things.Where (t => условие1 || (! Условие1 && условие2));
проблема в том, что оптимизатор запросов кажется
обрезать выражение до условия2
только.
Это должно действительно дать вам те, которые соответствуют условию1 независимо от условия2 ... и те, которые не соответствуют условию1 и условию2. Вместо этого одно условие2 не эквивалентно, потому что это исключает записи, которые соответствуют только условию1.
JS-версия just (условие1 || условие2) эквивалентна приведенному выше выражению в кавычках, так как, когда вы соответствуете условию1, вы уже сопоставляете оба условия2 и! Условие2, поэтому вы уже включаете условие2 для обоих случаев условие1 и! Условие1. Если это не совпадает с тем, что вы намеревались с запросами, то понятно, что проблема не в оптимизаторе, а в исходных выражениях.
Вам понадобятся полные выражения только в том случае, если вы объединяете 2 результата с Concat вместо Union, так как это будет означать, что вы получите результаты, совпадающие в обоих выражениях ... и тогда у вас будут повторяющиеся результаты. Но, напротив, Где вычисляется для каждой строки, так что у вас нет этих проблем там.
Второе: Из примера кода я думаю, что то, с чем вы сталкиваетесь, менее прямое, чем то, что вы делаете в своем вопросе. Вы упомянули, что получаете первый тег, но то, что вы действительно делаете, можно увидеть в этой переписанной версии:
public static IQueryable<BookTag> UniqueByTags(this IQueryable<BookTag> bookTags, User user)
{
return bookTags.GroupBy(BT => BT.TagId)
.Select(g => new BookTag() {
User = g.Any(bt => bt.UserId == user.Id) ? user : g.First().User,
Tag = g.First().Tag, Book = bookTags.First().Book
});
}
То, что упомянуто в комментарии, больше похоже на:
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) ?
g.First(bt=>bt.UserId == user.Id) :
g.First()
);
}