C# 按自定义订单订购项目

C# 按自定义订单订购项目,c#,entity-framework-core,linq-to-entities,entity-framework-core-3.1,C#,Entity Framework Core,Linq To Entities,Entity Framework Core 3.1,我在数据库中插入了一个列表: 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" } } 如何执行此操作?您可以链接:opeartor创建如下自定义排序: var qu

我在数据库中插入了一个列表:

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" }
}

如何执行此操作?

您可以链接
opeartor创建如下自定义排序:

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))

您可以链接
?:
opeartor创建如下自定义排序:

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))

很抱歉回答晚了,但我会写一个类似的扩展:

    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);
    }
static void Main(字符串[]args)
{
var items=new[]{1,2,3,4,5}.AsQueryable();
//例如,还原整个列表
var newOrder=newdictionary(){{1,5},{2,4},{3,3},{4,2},{5,1};
var sorted=items.OrderBy(newOrder.ToSwithExpression()).ToList();
foreach(排序中的变量i)
{
控制台写入线(i);
}
Console.ReadKey();
}
静态表达式ToSwithExpression(此字典dict,K defaultValue=default(K))
{
var paramm=表达式参数(typeof(T),“x”);
//如果没有映射-使用默认值。
表达式iter=表达式常数(默认值);
foreach(以dict为单位的var kv)
{
iter=表达式.条件(表达式.相等(paramm,表达式.常数(kv.Key)),表达式.常数(kv.Value,typeof(K)),iter);
}
返回表达式Lambda(表达式Convert(iter,typeof(K)),paramm);
}

如您所见,您可以指定映射开关而不是字典。我用字典只是因为它更容易。EF在咀嚼这一个并将其转换为类似于其他答案表达式时没有问题。

很抱歉回答晚了,但我会写一个类似于此的扩展:

    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);
    }
static void Main(字符串[]args)
{
var items=new[]{1,2,3,4,5}.AsQueryable();
//例如,还原整个列表
var newOrder=newdictionary(){{1,5},{2,4},{3,3},{4,2},{5,1};
var sorted=items.OrderBy(newOrder.ToSwithExpression()).ToList();
foreach(排序中的变量i)
{
控制台写入线(i);
}
Console.ReadKey();
}
静态表达式ToSwithExpression(此字典dict,K defaultValue=default(K))
{
var paramm=表达式参数(typeof(T),“x”);
//如果没有映射-使用默认值。
表达式iter=表达式常数(默认值);
foreach(以dict为单位的var kv)
{
iter=表达式.条件(表达式.相等(paramm,表达式.常数(kv.Key)),表达式.常数(kv.Value,typeof(K)),iter);
}
返回表达式Lambda(表达式Convert(iter,typeof(K)),paramm);
}

如您所见,您可以指定映射开关而不是字典。我用字典只是因为它更容易。EF在咀嚼这一个并将其转换为类似于其他答案表达式时不会有任何问题。

您可以这样做吗?houses.OrderBy(h=>h.Type=“C”)。ThenBy(h=>h.Type=“A”)等。我一下子记不起来了。对不起。也许你可以在数据库中添加一些OrderNumber字段,然后按该字段排序,而不是按自定义的订单排序。或者,如果您提供了另一个表,其中将提供排序顺序(即表中的记录按该顺序为“C”、“A”、“B”),您可以这样做吗?houses.OrderBy(h=>h.Type=“C”)。ThenBy(h=>h.Type=“A”)等。我一下子记不起来了。对不起。也许你可以在数据库中添加一些OrderNumber字段,然后按该字段排序,而不是按自定义的订单排序。或者,如果您提供了另一个表,其中将提供排序顺序(表示表中的记录按该顺序为“C”、“A”、“B”)。