【问题标题】:SQL to Linq group by countSQL to Linq 按计数分组
【发布时间】:2015-05-29 09:35:16
【问题描述】:

我在表中有一个列来计算特定行。 sql查询如下:

SELECT
    CASE
    WHEN trail LIKE 'ClassA%'   THEN 'ClassA'
    WHEN trail LIKE 'ClassB%' THEN 'ClassB'
    WHEN trail LIKE 'SemA%' THEN 'SemesterA'
    WHEN trail LIKE 'SemB%' THEN 'SemesterB'
  END AS Logs
, COUNT(*) AS Count
FROM Logs where s_date >= 'from date from UI' and e_date <= 'to date from ui'
GROUP BY 
  CASE
    WHEN trail LIKE 'ClassA%'   THEN 'ClassA'
    WHEN trail LIKE 'ClassB%' THEN 'ClassB'
    WHEN trail LIKE 'SemA%' THEN 'SemesterA'
    WHEN trail LIKE 'SemB%' THEN 'SemesterB'
END

上面的查询结果sql很好

ClassA 20
ClassB 5
SemesterA 2
SemesterB 50

现在,我需要使用日期过滤器(从日期到日期)将此 sql 更改为 Linq。 请建议更改查询以简化它。 谢谢

试过了:-

var data = _db.Logs.Where(p => p.trail.StartsWith("ClassA") && (p.SDate.Date >= CDate.Date && p.SDate.Date <= FDate.Date)).GroupBy(p => p.trail.StartsWith("ClassA")).Select(s =>
            new
            {
                source = "Class - A total",
                percentage = s.Count()

            }).Union(_db.Logs.Where(p => p.trail.StartsWith("ClassB") && (p.SDate.Date >= CDate.Date && p.SDate.Date <= FDate.Date)).GroupBy(p => p.trail.StartsWith("ClassB")).Select(s =>
            new
            {
                source = "Class - B total",
                percentage = s.Count()

            }).Union(_db.Logs.Where(p => p.trail.StartsWith("SemesterA") && (p.SDate.Date >= CDate.Date && p.SDate.Date <= FDate.Date)).GroupBy(p => p.trail.StartsWith("SemesterA")).Select(s =>
            new
            {
                source = "Semester - A total",
                percentage = s.Count()

            }).Union(_db.Logs.Where(p => p.trail.StartsWith("SemesterB") && (p.SDate.Date >= CDate.Date && p.SDate.Date <= FDate.Date)).GroupBy(p => p.trail.StartsWith("SemesterB")).Select(s =>
            new
            {
                source = "Semester - B total",
                percentage = s.Count()

            })))).ToList();

【问题讨论】:

    标签: sql linq count group-by


    【解决方案1】:

    尝试将所有有趣的起始键存储在某种枚举中,然后使用内置的 group by 方法重载,它输出从键、组对映射的结果(c.f. https://msdn.microsoft.com/en-us/library/vstudio/bb549393(v=vs.100).aspx

    string[] startingKeys = new string[] {"ClassA","ClassB","SemsterA","SemesterB"};
    
    var data =_db.Logs.Where(p=>(p.SDate.Date >= CDate.Date && p.SDate.Date <= FDate.Date)&&startingKeys.Any(k=>p.Logs.StartsWith(k))).GroupBy(p=>startingKeys.Where(k=>p.Logs.StartsWith(k)).First(),(key,items)=>new {source=key,count = items.Count()})
    

    此方法的一个优点是您可以在运行时更改启动键,如果您愿意的话。

    【讨论】:

    • 感谢尼克的查询和网址。我错过了 linq 查询中的 1 部分...来源仅为文本,未与数据库进行比较。 ex - 来源 =“类 - 总计”。我已经在帖子中更新了查询。 ——
    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    相关资源
    最近更新 更多