SQL到Linq组(按计数)

SQL到Linq组(按计数),sql,linq,count,group-by,Sql,Linq,Count,Group By,我在一个表中有一列来计算特定的行。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(*) A

我在一个表中有一列来计算特定的行。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更改为Linq,并使用日期过滤器from date,to date。 请建议更改查询以简化查询。 谢谢

尝试:-

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();

尝试将所有感兴趣的起始键存储在某种类型的枚举中,然后使用内置的group by方法重载,该重载输出从键group pairs c.f映射的结果


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

感谢Nick提供的查询和url。我在linq查询中遗漏了1部分…源代码仅为文本,未与数据库进行比较。ex-source=A类总计。我已在post中更新了查询
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();
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()})