C# C LINQ检查同一查询中的列之和
有没有办法检查PREM_a或PREM_B之和在同一个LINQ查询中是否不为0,而不是在单独的LINQ查询(如下面的匹配行)中是否为0C# C LINQ检查同一查询中的列之和,c#,linq,C#,Linq,有没有办法检查PREM_a或PREM_B之和在同一个LINQ查询中是否不为0,而不是在单独的LINQ查询(如下面的匹配行)中是否为0 var resultsDt = dt.AsEnumerable().GroupBy(row => new { Id = row.Field<string>("ID") }).Select(grp => { DataRow newRow = dt.NewRow(); newRow["ID"] = grp.Key.Id.
var resultsDt = dt.AsEnumerable().GroupBy(row => new
{
Id = row.Field<string>("ID")
}).Select(grp =>
{
DataRow newRow = dt.NewRow();
newRow["ID"] = grp.Key.Id.Trim();
newRow["PREM_A"] = grp.Sum(r => r.Field<decimal>("PREM_A"));
newRow["PREM_B"] = grp.Sum(r => r.Field<decimal>("PREM_B"));
return newRow;
}).CopyToDataTable();
var matchRows = resultsDt.Select().Where(x => x.Field<decimal>("PREM_A") != 0 || x.Field<decimal>("PREM_B") != 0);
foreach (DataRow row in matchRows)
{
//do something
}
您不需要为每一步都转换为数据表,如果您不这样做,查询会更容易
var query =
from row in dt.AsEnumerable()
group new
{
premA = row.Field<decimal>("PREM_A"),
premB = row.Field<decimal>("PREM_B"),
} by row.Field<string>("ID").Trim() into g
let premA = g.Sum(x => x.premA)
let premB = g.Sum(x => x.premB)
where premA != 0M || premB != 0M
select new
{
Id = g.Key,
PremA = premA,
PremB = premB,
};
此外:
添加Where before调用COPYTODATABLE。您是否需要将查询结果作为数据表?您还可以通过将let替换为另一个Select来执行lambda语法。为什么更改匿名对象属性名称的大小写?然后,您的最终选择将只列出Id=g.Key、premA、premB。我还想使用let,但使用它时,您不会在翻译时向查询中添加两个额外的选择?@NetMage:在这样的查询中,作为一般规则,我尝试对所有有效的局部变量使用camel case,对结果中的外部可访问值使用pascal case。当然,不用重命名它也可以工作,但这与我自己的个人代码背道而驰。@octavioccl:最终,它的翻译方式不会有多大区别。Linq最终总是会低于原始循环或其他方法。因此,如果您打算使用linq,从逻辑上讲,它应该是有效的,但要以可维护的形式编写它。
var resultsDt = dt.AsEnumerable()
.GroupBy(row => row.Field<string>("ID"))
.Select(grp =>new {Id= grp.Key,
PREM_A= grp.Sum(r => r.Field<decimal>("PREM_A")),
PREM_B=grp.Sum(r => r.Field<decimal>("PREM_B"))
})
.Where(e=>e.PREM_A!=0 || e.PREM_B!=0);