我有一个订单列表,它有一个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;
}
1条答案
按热度按时间eit6fx6z1#
这完全取决于您的数据大小和您想要实现的目标。
如果你有小的数据集,没有分页,你可以在客户端排序(在你的dotnet代码)。
如果你有一个大的数据集,和/或你需要分页,那么你将需要应用排序到数据库。在这种情况下,我会建议你把转换的值存储在同一个表作为拥有的实体或可能不同的表。然后你可以在你的LINQ查询中应用排序。
您得到两个好处是,
你失去了什么,
如果订单状态是一组固定的数据,如
enum
,则可以选择使用非规范化设计,即使用一个包含翻译的专用OrderStatus
表,然后将它们连接到Order表。您的域将类似于,