如何在 C# 中使用字典自定义订单?

How to make a custom order with Dictionary in C#?

我正在尝试根据状态对列表中的所有项目进行排序。我尝试使用 Dictionary 按以下方式执行此操作,但它给了我一个错误。你能帮我做对吗?

根据它们的状态顺序应如下:已激活、已暂停、已过期和已用完。

var table = _plapsaContext.Coupons;
var query = _plapsaContext.Coupons.AsQueryable();

query.Select(e => new CouponDto{
                Id = e.Id,
                StartingDate = e.StartingDate,
                EndingDate = e.EndingDate,
                Amount = e.Amount,
                TotalCoupons = e.TotalCoupons,
                MinimumAmount = e.MinimumAmount,
                RestCoupons = e.RestCoupons,
                ContractId = e.ContractId,
                Status = (e.EndingDate.Date < DateTime.Now.Date && e.Status != CouponStatus.Paused && e.Status != CouponStatus.Drained) ? CouponStatus.Expired : e.Status,
                ContractCode = e.ContractId.HasValue ? e.Contract.Code.ToString() : null,
                OwnerAssociationCode = e.OwnerAssociactionCode,
                BuildingManagerName = e.ContractId.HasValue ? e.Contract.BuildingManagerName : null,
                ExcludeFunctionalUnits = e.ExcludeFunctionalUnits
            });

Dictionary<CouponStatus, int> orderCoupons = new Dictionary<CouponStatus, int>
            {
                { CouponStatus.Activated, 0 },
                { CouponStatus.Paused, 1 },
                { CouponStatus.Expired, 2 },
                { CouponStatus.Drained, 3 },
            };

Array.Sort(query.ToArray(), (p, q) => orderCoupons[p.Status].CompareTo(orderCoupons[q.Status]));
Console.WriteLine(query);

return (IQueryable<CouponDto>)query;

希望你能帮帮我!非常感谢!

此查询应按所需方式排序。我不认为你需要在这里排序字典。以下查询将在服务器端对数据进行排序。

var query = _plapsaContext.Coupons.AsQueryable();

var dtoQuery = query
    .Select(e => new CouponDto
    {
        Id = e.Id,
        StartingDate = e.StartingDate,
        EndingDate = e.EndingDate,
        Amount = e.Amount,
        TotalCoupons = e.TotalCoupons,
        MinimumAmount = e.MinimumAmount,
        RestCoupons = e.RestCoupons,
        ContractId = e.ContractId,
        Status = (e.EndingDate.Date < DateTime.Now.Date && e.Status != CouponStatus.Paused && e.Status != CouponStatus.Drained) ? CouponStatus.Expired : e.Status,
        ContractCode = e.ContractId.HasValue ? e.Contract.Code.ToString() : null,
        OwnerAssociationCode = e.OwnerAssociactionCode,
        BuildingManagerName = e.ContractId.HasValue ? e.Contract.BuildingManagerName : null,
        ExcludeFunctionalUnits = e.ExcludeFunctionalUnits
    });

dtoQuery = dtoQuery
    .OrderBy(e => e.Status == CouponStatus.Activated ? 0 
        : e.Status == CouponStatus.Paused ? 1
        : e.Status == CouponStatus.Expired ? 2
        : e.Status == CouponStatus.Drained : 3
    );

return dtoQuery;