使用LINQ计算C#中的记录

Pau*_*ews 5 .net c# sql linq count

我有一个简单的SQL查询:

Select ID, COUNT(ID) as Selections, OptionName, SUM(Units) as Units
FROM tbl_Results
GROUP BY ID, OptionName
Run Code Online (Sandbox Code Playgroud)

我得到的结果是:

'1' '4' 'Approved'    '40' 
'2' '1' 'Rejected'    '19'
'3' '2' 'Not Decided' '12'
Run Code Online (Sandbox Code Playgroud)

我必须加密数据库中的数据,因此无法以关系形式对数据求和.为了解决这个问题,我解密了应用程序层中的数据,并希望使用LINQ在那里进行查询.我需要以下结果:

'1' 'Approved'     '10'
'3' 'Not Deceided' '6'
'2' 'Rejected'     '19'
'1' 'Approved'     '15'
'1' 'Approved'     '5'
'3' 'Not Deceided' '6'
'1' 'Approved'     '10'
Run Code Online (Sandbox Code Playgroud)

我将这些结果放入类中并创建一个强类型列表:

public class results
{
 public int ID {get;set;}
 public string OptionName {get;set;}
 public int Unit {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我几乎有LINQ查询来返回结果,如SQL查询:

var q = from r in Results
        group p.Unit by p.ID
        int g
        select new {ID = g.Key,
                    Selections = g.Count(),
                    Units = g.Sum()};
Run Code Online (Sandbox Code Playgroud)

我如何确保我的LINQ查询也给我了Option Name

如果我创建了一个名为Statisticshold to my results 的类,我将如何修改LINQ查询以给我List<Statistics>结果集?

public class results
    {
     public int ID {get;set;}
     public int NumberOfSelections { get; set; }
     public string OptionName {get;set;}
     public int UnitTotal {get;set;}
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 4

您当前只是按 ID 进行分组。相反,根据原始查询,您还需要按选项名称进行分组。这样每个组的密钥将包含 ID 和选项名称。这就是变化:

var q = from r in Results
        group r.Unit by new { p.ID, p.OptionName } into g
        select new { ID = g.Key.ID,
                     OptionName = g.Key.OptionName
                     Selections = g.Count(),
                     UnitTotal = g.Sum() };
Run Code Online (Sandbox Code Playgroud)

现在,我并没有立即意识到您只是为组项目选择了“单位”部分。我在查询表达式中错过了“group p.Unit by”。我的错...但其他人可能也会这样做。这是一种替代方法,它使组包含项目,然后对投影中的单位求和:

var q = from r in Results
        group r by new { p.ID, p.OptionName } into g
        select new { ID = g.Key.ID,
                     OptionName = g.Key.OptionName
                     Selections = g.Count(),
                     UnitTotal = g.Sum(x => x.Unit) };
Run Code Online (Sandbox Code Playgroud)