C# 通过多次比较按降序排列

C# 通过多次比较按降序排列,c#,linq,C#,Linq,我想对结果进行多次比较,如(按付费用户、更新日期、创建日期) var order = _vrepository.Details() .Where(od => od.Order.Id != null && od.PlanName.ToLower().Contains("DP".ToLower())

我想对结果进行多次比较,如(按付费用户、更新日期、创建日期)

var order = _vrepository.Details()
                          .Where(od => od.Order.Id != null
                                       && od.PlanName.ToLower().Contains("DP".ToLower())
                                       && od.Order.Status == true)
                          .OrderByDescending(od => od.ValidityTill)
                          .Select(ord => ord.Order.Id.Value);
上面一个我得到的是付费用户

var updatedList = _repository.GetUsers()
                             .Where(c => c.UpdatedDate != null
                                         && fresh <= c.UpdatedDate)
                             .Select(c => c.Id);
为了显示有序列表,我执行了以下代码:

Func<IQueryable<User>, IOrderedQueryable<User>> orderingFunc = query =>
{
    if (order.Count() > 0)
        return query.OrderByDescending(rslt => lstId .Contains(rslt.Id))
                    .ThenByDescending(rslt => lstUpdatedUsersId .Contains(rslt.Id))
                    .ThenByDescending(rslt => lstCreatedDatewiseUsers.Contains(rslt.Id));
    else
        return query.OrderByDescending(rslt => lstUpdatedUsersId .Contains(rslt.Id))
                    .ThenByDescending(rslt => rslt.UpdatedDate);
};
Func orderingFunc=query=>
{
if(order.Count()>0)
返回query.OrderByDescending(rslt=>lstId.Contains(rslt.Id))
.ThenByDescending(rslt=>lstUpdatedUsersId.Contains(rslt.Id))
.ThenByDescending(rslt=>lstCreatedDatewiseUsers.Contains(rslt.Id));
其他的
返回query.OrderByDescending(rslt=>lstUpdateUserSid.Contains(rslt.Id))
.ThenByDescending(rslt=>rslt.UpdateDate);
};
但我得到的结果是一个付费用户,一些创建用户和日期是3年前一样明智。我想得到的确切订单如下

  • 有序用户
  • 更新用户
  • 创建用户

请帮我解决这个问题。希望我能得到正确的结果。

我已经根据您的要求尝试了这段代码

public class Program
{
    public static void Main()
    {
        var l1= new List<int>{1,2,3};
        var l2= new List<int>{4,5,6};
        var l3= new List<int>{7,8,9};
        var testList = new List<Test>{new Test{Id=9,Name="test1"},new Test{Id=11,Name="test1"},new Test{Id=5,Name="test1"},new Test{Id=7,Name="test1"},new Test{Id=2,Name="test1"}};
        var orderedList= testList.OrderByDescending(e=> l1.Contains(e.Id)).ThenByDescending(e=> l2.Contains(e.Id)).ThenByDescending(e=> l3.Contains(e.Id));
        Console.WriteLine(string.Join("\t", orderedList.Select(e=> e.Id).Cast<int>().ToArray()));
// it prompts 2    5    9    7    11
    }
}

public class Test{
    public int Id{get; set;}
    public string Name{get; set;}
}
公共类程序
{
公共静态void Main()
{
var l1=新列表{1,2,3};
var l2=新列表{4,5,6};
var l3=新列表{7,8,9};
var testList=new List{new Test{Id=9,Name=“test1”},new Test{Id=11,Name=“test1”},new Test{Id=5,Name=“test1”},new Test{Id=7,Name=“test1”},new Test{Id=2,Name=“test1”};
var orderedList=testList.OrderByDescending(e=>l1.Contains(e.Id))。然后ByDescending(e=>l2.Contains(e.Id))。然后ByDescending(e=>l3.Contains(e.Id));
Console.WriteLine(string.Join(“\t”,orderedList.Select(e=>e.Id).Cast().ToArray());
//它会提示2 5 9 7 11
}
}
公开课考试{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
它的工作原理和你预期的一样。也许我还不明白你想要实现什么。
可能您用于对项目进行排序的函数位于if语句的错误分支中,请检查
if(order.Count()>0)

是否存在重复项。您是否解决了此问题?否。我无法。没有人给我一个正确的答案。我试过了。但是它没有显示准确的结果为什么结果是错误的?在我的回答中,哪一个是错误的行为?
Func<IQueryable<User>, IOrderedQueryable<User>> orderingFunc = query =>
{
    if (order.Count() > 0)
        return query.OrderByDescending(rslt => lstId .Contains(rslt.Id))
                    .ThenByDescending(rslt => lstUpdatedUsersId .Contains(rslt.Id))
                    .ThenByDescending(rslt => lstCreatedDatewiseUsers.Contains(rslt.Id));
    else
        return query.OrderByDescending(rslt => lstUpdatedUsersId .Contains(rslt.Id))
                    .ThenByDescending(rslt => rslt.UpdatedDate);
};
public class Program
{
    public static void Main()
    {
        var l1= new List<int>{1,2,3};
        var l2= new List<int>{4,5,6};
        var l3= new List<int>{7,8,9};
        var testList = new List<Test>{new Test{Id=9,Name="test1"},new Test{Id=11,Name="test1"},new Test{Id=5,Name="test1"},new Test{Id=7,Name="test1"},new Test{Id=2,Name="test1"}};
        var orderedList= testList.OrderByDescending(e=> l1.Contains(e.Id)).ThenByDescending(e=> l2.Contains(e.Id)).ThenByDescending(e=> l3.Contains(e.Id));
        Console.WriteLine(string.Join("\t", orderedList.Select(e=> e.Id).Cast<int>().ToArray()));
// it prompts 2    5    9    7    11
    }
}

public class Test{
    public int Id{get; set;}
    public string Name{get; set;}
}