C# Linq排序依据(含新的Map值)

iugsix8n  于 2022-12-06  发布在  C#
关注(0)|答案(1)|浏览(260)

我有一个订单列表,它有一个int类型的属性“Status”。对于每个状态,我都有不同语言的翻译。我想按选定的翻译而不是按数字状态值对列表进行排序。这里的最佳做法是什么?

public record OrderTranslation
{
    public string   OrderStatus       { get; set; }
    public string   StatusDescription { get; set; }
    public Language Language          { get; set; }
}
    
public record Order 
{
    public int? Id     { get; set; }
    public int  Status { get; set; }
        
    // I have added a new value to set the translated value and I want to order by this
    public string TranslatedStatusValue { get; set;}
}

我职责:

public async Task<FilterResult> FilterAsync(FilterRequest filterRequest, List<string> filterProperties, Language selectedLanguage)
{
    var orderTranslations = dataContext
        .OrderTranslations
        .Where(ot => ot.Language == selectedLanguage)
        .ToList();
    
    var orders = dataContext.Orders.AsNoTracking();
    
    foreach (var order in orders)
    {
        var description = orderTranslations
            .Single(x => x.OrderStatus == serviceContract.Status)
            .StatusDescription;

        serviceContract.TranslatedValue = description;
    }

    // The TranslatedValue is always empty here
    // This is not working, but I want to Order by the translation. Is there another possibility to to this, not using an extra property?
    IQueryable<ServiceContractOrder> query = orders
        .OrderBy("TranslatedStatusValue", filterRequest.IsSortAscending)
        .WhereMatchesFilter(filterRequest, filterProperties);
                             
    result.FilterHits = await query
        .Skip(filterRequest.ItemsToSkip())
        .Take(filterRequest.ItemsPerPage)
        .Cast<object>()
        .ToListAsync();

    result.TotalCount = await query.CountAsync();
    result.ObjectType = typeof(Order).AssemblyQualifiedName;
    result.FilteredProperties = filterProperties;
}
eit6fx6z

eit6fx6z1#

这完全取决于您的数据大小和您想要实现的目标。
如果你有小的数据集,没有分页,你可以在客户端排序(在你的dotnet代码)。
如果你有一个大的数据集,和/或你需要分页,那么你将需要应用排序到数据库。在这种情况下,我会建议你把转换的值存储在同一个表作为拥有的实体或可能不同的表。然后你可以在你的LINQ查询中应用排序。
您得到两个好处是,

  • 排序是绝对的,并且在查询之间保持顺序。
  • 性能,因为在客户端排序会损害大型数据集。

你失去了什么,

  • 对翻译所做的任何更改都必须应用到数据库中。这会使您的数据库变得复杂。

如果订单状态是一组固定的数据,如enum,则可以选择使用非规范化设计,即使用一个包含翻译的专用OrderStatus表,然后将它们连接到Order表。
您的域将类似于,

public record OrderStatus
{
   int Id{get; set;}
   public ISet<OrderTranslation> Translations { get; set; }
}

public record OrderTranslation(Language Language, string)
{
    public string   OrderStatus       { get; set; }
    public string   StatusDescription { get; set; }
    public Language Language          { get; set; }
}
    
public record Order 
{
    public int? Id     { get; set; }
    public OrderStatus  Status { get; set; }
}

相关问题