首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于Where+ToDictionary原因导致LINQ查询速度较慢

由于Where+ToDictionary原因导致LINQ查询速度较慢
EN

Stack Overflow用户
提问于 2021-05-07 16:46:00
回答 1查看 65关注 0票数 0

我有一个需要运行的查询:

代码语言:javascript
复制
IEnumerable<MerchantWithParameters> merchants =
    from i in (
        from m in d.GetTable<Merchant>()
        join mtp in d.GetTable<MerchantToParameters>() on m.Id equals mtp.MerchantId into mtps
        from mtp in mtps.DefaultIfEmpty()
        join cp in d.GetTable<ContextParameters>() on mtp.ContextParametersId equals cp.Id into cps
        from cp in cps.DefaultIfEmpty()
        select new {Merchant = m, ContextParameter = cp}
    )
    group i by new { i.Merchant.Id } into ig
    select new MerchantWithParameters()
    {
        Id = ig.Key.Id,
        Parameters = ig.Where(g => g.ContextParameter != null).ToDictionary(g => g.ContextParameter.Key, g => g.ContextParameter.Text)
    };

由于某些原因,这个查询需要很长时间才能完成。

我相信这跟

代码语言:javascript
复制
Parameters = ig.Where(g => g.ContextParameter != null).ToDictionary(g => g.ContextParameter.Key, g => g.ContextParameter.Text)

因为当我删除这一行时,查询开始执行得非常快。

你能告诉我我哪里做错了吗?

更新:我使用ToList()从数据库中提取数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-07 19:01:31

这是已知的SQL限制。无法获取分组项,只能获取分组键或聚合结果。因为您需要所有记录,所以我们可以在客户端进行分组,但以前最大限度地限制了检索到的数据。

代码语言:javascript
复制
var query = 
    from m in d.GetTable<Merchant>()
    from mtp in d.GetTable<MerchantToParameters>().LeftJoin(mtp => m.Id == mtp.MerchantId)
    from cp in d.GetTable<ContextParameters>().LeftJoin(cp => mtp.ContextParametersId == cp.Id)
    select new 
    { 
        MerchantId = m.Id, 
        ContextParameterKey = (int?)cp.Key, 
        ContextParameterText = cp.Text
    };

var result = 
    from q in query.AsEnumerable()
    group q by q.MerchantId into g
    select new MerchantWithParameters
    {
        Id = g.Key,
        Parameters = g.Where(g => g.ContextParameterKey != null)
           .ToDictionary(g => g.ContextParameterKey.Value, g => g.ContextParameterText)
    };

var merchants = result.ToList();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67431710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档