使用LINQ计算C#中的记录

时间:2010-03-22 17:28:13

标签: c# .net sql linq count

我有一个简单的SQL查询:

Select ID, COUNT(ID) as Selections, OptionName, SUM(Units) as Units
FROM tbl_Results
GROUP BY ID, OptionName

我得到的结果是:

'1' '4' 'Approved'    '40' 
'2' '1' 'Rejected'    '19'
'3' '2' 'Not Decided' '12'

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

'1' 'Approved'     '10'
'3' 'Not Deceided' '6'
'2' 'Rejected'     '19'
'1' 'Approved'     '15'
'1' 'Approved'     '5'
'3' 'Not Deceided' '6'
'1' 'Approved'     '10'

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

public class results
{
 public int ID {get;set;}
 public string OptionName {get;set;}
 public int Unit {get;set;}
}

我几乎有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()};

如何确保我的LINQ查询还提供Option Name

如果我创建了一个名为Statistics的类来保存我的结果,我将如何修改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;}
    }

2 个答案:

答案 0 :(得分: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() };

现在,我没有立即明白你只选择了组项目的“单位”部分。我错过了查询表达式中的“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) };

答案 1 :(得分:1)

此查询按ID和选项名称分组,从而使其可用:

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

要返回自定义结果类,请使用:

var q = from r in Results
        group p.Unit by new { ID = p.ID, OptionName = p.OptionName } into g
        select new results() {
            ID = g.Key.ID,
            OptionName = g.Key.OptionName,
            NumberOfSelections = g.Count(),
            UnitTotal = g.Sum()
        };