LINQ Lambda 代码中的 groupby orderby 效率

4

我有这段代码,但我认为它可以更快地运行,或者说我希望它能更快一些。但是我有很多数据。我希望让它尽可能地有效。

以下是代码:

(需要根据Expression<Func<ResourcesTranslation, bool>> ConditionExpression将资源中的单词(语言和值)按资源和语言分组返回最新的翻译)

KeyValues = item.Resources
                .Where(ConditionExpression)
                .GroupBy(g => new { g.ResourceId, g.Language })                  
                .Select(m => m.OrderByDescending(o => o.Changed ?? o.Created))
                .Select( s => new KeyValues
                {
                    Language = s.FirstOrDefault().Language,
                    KeyValue = s.FirstOrDefault().Value
                }).ToList();

请使用ToListAsync(),而不是ToList()。 - BorHunter
1
为什么需要两个选择器?请提供您的模型数据。 - BorHunter
因为我想从组中获取值并对其进行排序。 - Qhori
@BorHunter 和 Select 不能这样使用:.Select(m => m.OrderByDescending(o => o.Changed.HasValue ? o.Changed : o.Created), m => new KeyValues{...}) - Qhori
3个回答

2

如果你只需要在分组后返回一个元素,可以直接在GroupBy子句中返回它,这将简化你的代码:

KeyValues = item.Resources
    .Where(ConditionExpression)
    .GroupBy(g => new { g.ResourceId, g.Language }, 
         (x, y) => new { Max = y.OrderByDescending(o => o.Changed ?? o.Created).First() })
    .Select(s => new KeyValues
    {
        Language = s.Max.Language,
        KeyValue = s.Max.Value
    })
    .ToList();

你应该考虑通过点击复选标记来接受答案对你有帮助。@Qhori - Nguyễn Văn Phong

0
我发现Visual Studio将其转换为selects,所以我意识到,像这样的东西最好的解决方案是创建一些视图..只是回答自己的问题,为其他人提供答案。

0

尽管您可以通过删除第一个不必要的选择(根据数据量,这可能是最小到中等的改进)来获得一些性能,例如:

KeyValues = item.Resources
                .Where(ConditionExpression)
                .GroupBy(g => new { g.ResourceId, g.Language })                  
                .OrderByDescending(o => o.Changed.HasValue ? o.Changed : o.Created)
                .Select( s => new KeyValues
                {
                    Language = s.Language,
                    KeyValue = s.Value
                }).ToList();

根据您的情况,您可以:

  1. 如果您的数据存储在数据库中,您可以创建数据库优化,例如添加索引、更新统计信息、使用提示等。

  2. 如果这是本地数据,您可以使用一些策略将新旧数据分别放置在不同的可枚举对象中。

没有其他方法可以显著提高您的 Linq 查询。您需要找到另一种策略来实现它。


必须在select中使用orderbydesc,因为你无法从组中获取Changed和Created的值。 - Qhori

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接