Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C LINQ检查同一查询中的列之和_C#_Linq - Fatal编程技术网

C# C LINQ检查同一查询中的列之和

C# 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.

有没有办法检查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.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);