我有一个简单的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;}
}
答案 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()
};