Предотвратить сортировку результата объединения в рамках сущности

На сервере SQL union результат сортируется по столбцу первичного ключа. Я хочу предотвратить такое поведение в инфраструктуре сущностей.
В этом сообщении @praveen объяснил, как это сделать в чистый sql. Но я хочу сделать это в Entity Framework.
Мой код:

public virtual ActionResult Search(string keyword)
{
    var products = _db.Products
        .Where(x => x.IsActive)
        .AsQueryable();

    var productExactlyTitle = products.Where(x => x.Title == keyword);
    var productStartTitle = products.Where(x => x.Title.StartsWith(keyword));
    var productContainsTitle = products.Where(x => x.Title.Contains(keyword)
                                                   || x.Title.Contains(keyword)
                                                   || x.SubTitle.Contains(keyword)
                                                   || x.OtherName.Contains(keyword));


    var productList = productExactlyTitle.Union(productStartTitle)
        .Union(productContainsTitle)
        .Take(10)
        .AsEnumerable()
        .Select(x => new ProductItemViewModel()
        {
            Id = x.Id,
            Title = x.Title,
            Price = x.Price.ToPrice(),
            Image = x.Images.FirstOrDefault(y => y.IsCoverPhoto)?.ImageUrl
        });

        // some code ...        
}

Я хочу показать записи в следующем порядке:

Первый: записи productExactlyTitle
Второй: записи productStartTitle
Третий: записи productContainsTitle

Но результат отсортирован по столбцу Id! и я не хочу этого.

Есть ли способ сделать это?


person Majid Basirati    schedule 12.12.2016    source источник
comment
Вам нужно показать нам код, который вы пробовали, иначе мы не сможем помочь. См. stackoverflow.com/help/how-to-ask.   -  person Peter B    schedule 12.12.2016


Ответы (1)


В SQL все запросы без явно установленного order by считаются неупорядоченными. (и запросы EF переводятся в SQL). Поэтому, если вы хотите определенный порядок после вашего союза, просто укажите его.

var result = q1.Union(q2).OrderBy(x => x.?);

Для вашего конкретного случая:

var p1 = productExactlyTitle.Select(x => new { Item = x, Order = 1 });
var p2 = productStartTitle.Select(x => new { Item = x, Order = 2 });
var p3 = productContainsTitle.Select(x => new { Item = x, Order = 3 });
var productList = p1.Union(p2)
                    .Union(p3)
                    .OrderBy(x => x.Order)
                    .Select(x => x.Item)
                    .Take(10);
person Magnus    schedule 12.12.2016
comment
Пожалуйста, посмотрите мой код. Когда я запускаю свой проект, записи упорядочиваются на основе столбца Id. - person Majid Basirati; 12.12.2016
comment
@MajidBasirati Я обновил ответ для кода, который вы добавили. - person Magnus; 12.12.2016
comment
Это именно то, что я хочу. Спасибо. - person Majid Basirati; 12.12.2016