Заказ товаров по индивидуальному заказу - PullRequest
0 голосов
/ 27 января 2020

У меня есть список, который я вставил в базу данных:

List<House> houses = new List<House> {
  new House { Id = 1, Type = "A" },
  new House { Id = 2, Type = "B" },
  new House { Id = 3, Type = "C" }
  new House { Id = 4, Type = "B" }
}

Используя Linq для сущностей, мне нужно получить Дома, упорядоченные по типу, но это должно быть:

 Houses of Type C
 Houses of Type A
 Houses of Type B

Как сделать это?

Ответы [ 2 ]

1 голос
/ 27 января 2020

Вы можете объединить оператор ? : в цепочку для создания пользовательской сортировки следующим образом:

var query = from h in context.Houses
            orderby h.Type == "C" ? 0 : (h.Type == "A" ? 1 : 2)
            select h;

Или синтаксис метода

var query = context.Houses.OrderBy(h => h.Type == "C" ? 0 : (h.Type == "A" ? 1 : 2))
0 голосов
/ 27 января 2020

Извините за поздний ответ, но я бы написал расширение, подобное этому:

    static void Main(string[] args)
    {
        var items = new[] { 1, 2, 3, 4, 5 }.AsQueryable();

        //for example, revert entire list
        var newOrder = new Dictionary<int, int>() { { 1, 5 }, { 2, 4 }, { 3, 3 }, { 4, 2 }, { 5, 1 } };
        var sorted = items.OrderBy(newOrder.ToSwithExpression())).ToList();

        foreach(var i in sorted)
        {
            Console.WriteLine(i);
        }
        Console.ReadKey();
    }

    static Expression<Func<T, K>> ToSwithExpression<T, K>(this Dictionary<T, K> dict, K defaultValue = default(K))
    {
        var paramm = Expression.Parameter(typeof(T), "x");
        //If nothing maps - use default value.
        Expression iter = Expression.Constant(defaultValue);
        foreach (var kv in dict)
        {
            iter = Expression.Condition(Expression.Equal(paramm, Expression.Constant(kv.Key)), Expression.Constant(kv.Value, typeof(K)), iter);
        }

        return Expression.Lambda<Func<T, K>>(Expression.Convert(iter, typeof(K)), paramm);
    }

Как видите, вы можете указать переключатель отображения вместо словаря. Я использовал словарь только потому, что это проще. У EF не будет проблем с пережевыванием этого и превращением его в выражение, похожее на другие ответы.

...