【问题标题】:C# Linq equivalent for SQL script not respondingSQL 脚本的 C# Linq 等效项没有响应
【发布时间】:2019-02-18 23:19:46
【问题描述】:

我有以下 SQL 脚本,它运行良好且速度非常快:

select top 30 CONVERT(date, p.DateCreated) as Fecha,
(select count(*) from People d where d.recipientid = p.recipientid and d.SubscriptionType = 0 and CONVERT(date, p.DateCreated) = CONVERT(date, d.DateCreated)) as Subscribed
from People p
where p.RecipientId = '276643679047355'
group by CONVERT(date, p.DateCreated), p.RecipientId
order by CONVERT(date, p.DateCreated) desc;

但是,当我尝试使用 LinQ 从 C# 应用程序调用它时,它没有按预期响应(事实上,在等待 5 分钟后,我必须说它根本没有响应)。我想出了下面的 LinQ 命令,但是,一定有问题,因为它的响应速度不如提供的 SQL 脚本快:

            model = await _context.People
                .Where(x => x.RecipientId == recipientId && x.DateCreated > startDate && x.DateCreated < endDate)
                .Select(x => new { DateGrouped = x.DateCreated.ToString("yyyy-MM-dd"), x.RecipientId })
                .GroupBy(x => new { x.DateGrouped, x.RecipientId })
                .Select(a => new StatsViewModel
                {
                    DateStatsFormatted = a.Key.DateGrouped,
                    Subscribed = _context.People.Where(d => d.RecipientId == a.Key.RecipientId && d.SubscriptionType == SubscriptionType.Suscribed && d.DateCreated.ToString("yyyy-MM-dd") == a.Key.DateGrouped).Count()
                }
                )
                .ToListAsync();

您能否帮我指出我做错了什么,或者至少建议我搜索什么?

【问题讨论】:

  • 当您运行 SQL 跟踪时,正在向服务器提交什么 SQL?
  • 你有没有考虑使用yyyy-MM-dd而不是stackoverflow.com/a/46936300/34092
  • 嗨 @mjwills,我不知道如何使用 SQL 跟踪......让我找出来,我会回复你
  • @mjwills,我会尝试使用建议的方法......但是,我在另一个没有 GroupBy 的 LinQ 查询中使用 yyyy-MM-dd 方法,它工作正常。

标签: c# sql linq group-by


【解决方案1】:

嗯,经过一个漫长的下午尝试不同的方法,我终于想通了。 我无法使用我的 SQL 分析器,因为我的数据库在 Azure 上,而且它似乎不兼容。日期格式也不是我的解决方案。问题出在我对“已订阅”属性的嵌套查询上……似乎它正在创建一种循环引用。 这是现在可行的方法:

            model = await _context.People
                .Where(x => x.RecipientId == recipientId && x.DateCreated > startDate && x.DateCreated < endDate)
                .Select(x => new { DateGrouped = x.DateCreated.ToString("yyyy-MM-dd"), x.RecipientId, x.SubscriptionType })
                .GroupBy(x => new { x.DateGrouped, x.RecipientId })
                .Select(a => new StatsViewModel
                {
                    DateStatsFormatted = a.Key.DateGrouped,
                    Subscribed = a.Count(c=>c.SubscriptionType == SubscriptionType.Suscribed),
                    Unsubscribed = a.Count(c=>c.SubscriptionType == SubscriptionType.Unsuscribed),
                    NoSet = a.Count(c=>c.SubscriptionType == SubscriptionType.NoSet)
                }
                )
                .ToListAsync();

请注意,我只在我的主选择中添加了一个属性“SubscriptionType”,以便稍后在过滤后的选择中使用它作为“订阅”属性过滤器的一部分......非常简单,直接并且有效就像一个魅力!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-24
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2011-01-10
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多