Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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/ASP.NET中,对列求和会导致null_C#_Asp.net_Linq - Fatal编程技术网

C# 在C/ASP.NET中,对列求和会导致null

C# 在C/ASP.NET中,对列求和会导致null,c#,asp.net,linq,C#,Asp.net,Linq,我使用以下sql语句计算列的和: select coalesce(SUM(cdin_ActMortgageAmnt),0) from CDIndex,company where comp_companyid=cdin_companyid and comp_idcust like '%10319%' and cdin_Deleted is null and cdin_startunstufdate is not null and cdin_Status='InProgress

我使用以下sql语句计算列的和:

 select coalesce(SUM(cdin_ActMortgageAmnt),0) 
 from CDIndex,company  
 where  comp_companyid=cdin_companyid and comp_idcust like '%10319%' 
 and cdin_Deleted is null and cdin_startunstufdate is not null 
 and cdin_Status='InProgress'
给我这样的输出:

var sumation = (from com in db.Companies
                join cd in db.CDIndexes on com.Comp_CompanyId equals cd.cdin_CompanyId
                where
                    cd.cdin_Status == "InProgress" &&
                    cd.cdin_startunstufdate == null &&
                    cd.cdin_Deleted == null
                select new {
                    sum = cd.cdin_ActMortgageAmnt 
                }
               );

var summ = sumation.Sum(x => x.sum);
var summ = db.Companies.Join(
    db.CDIndexes,
    cd => cd.cdin_CompanyId,
    com => Comp_CompanyId,
    (com, cd) => new { com, cd })
  .Where(z=>z.com.comp_idcust.Contains("10319") // Added "LIKE"
    && z.cd.cdin_Status == "InProgress" 
    && z.cd.cdin_startunstufdate != null // Reversed your condition
    && z.cd.cdin_Deleted == null)
  .Sum(z=>z.cd.cdin_ActMortgageAmnt);
我尝试将其转换为LINQ,如下所示:

var sumation = (from com in db.Companies
                join cd in db.CDIndexes on com.Comp_CompanyId equals cd.cdin_CompanyId
                where
                    cd.cdin_Status == "InProgress" &&
                    cd.cdin_startunstufdate == null &&
                    cd.cdin_Deleted == null
                select new {
                    sum = cd.cdin_ActMortgageAmnt 
                }
               );

var summ = sumation.Sum(x => x.sum);
var summ = db.Companies.Join(
    db.CDIndexes,
    cd => cd.cdin_CompanyId,
    com => Comp_CompanyId,
    (com, cd) => new { com, cd })
  .Where(z=>z.com.comp_idcust.Contains("10319") // Added "LIKE"
    && z.cd.cdin_Status == "InProgress" 
    && z.cd.cdin_startunstufdate != null // Reversed your condition
    && z.cd.cdin_Deleted == null)
  .Sum(z=>z.cd.cdin_ActMortgageAmnt);
在调试模式下,当我将跟踪点放在var summ旁边时,当我指向它时,它会给我null


问题是什么?

在您的案例中,您使用的是coalesceSUMcdin\u ActMortgageAmnt,0,因为cdin\u ActMortgageAmnt的某些值可以为空,并且您将默认值设置为0,因此您需要在最终查询中执行相同的操作。当您执行选择时,会出现类似这样的情况

cd.cdin_ActMortgageAmnt ?? 0

此查询适合您的sql查询

     var sumation =db.Companies.Join(db.CDIndexes,
                                        com=>com.Comp_CompanyId,
                                        cd=>cd.cdin_companyid,
                                        (com,cd)=>new {com,cd})
                                   .Where(x=>x.com.comp_idcust.Contains("10319") && x.cd.cdin_Status== "InProgress" &&
                                          cd.cdin_startunstufdate != null &&
                                          cd.cdin_Deleted == null)
                                   .Select(x=>new 
                                   {
                                      sum=x.cd.cdin_ActMortgageAmnt ?? 0
                                   }).ToList()
这里有一个方法:

var summ = db.Companies.Join(
    db.CDIndexes,
    cd => cd.cdin_CompanyId,
    com => Comp_CompanyId,
    (com, cd) => new { com, cd })
  .Where(z=>z.com.comp_idcust.Contains("10319")) // Added "LIKE"
  .Where(z=>z.cd.cdin_Status == "InProgress")
  .Where(z=>z.cd.cdin_startunstufdate != null) // Reversed your condition
  .Where(z=>z.cd.cdin_Deleted == null)
  .Sum(z=>z.cd.cdin_ActMortgageAmnt);
您也可以将所有位置组合在一起,但我不希望在大多数情况下这样:

var sumation = (from com in db.Companies
                join cd in db.CDIndexes on com.Comp_CompanyId equals cd.cdin_CompanyId
                where
                    cd.cdin_Status == "InProgress" &&
                    cd.cdin_startunstufdate == null &&
                    cd.cdin_Deleted == null
                select new {
                    sum = cd.cdin_ActMortgageAmnt 
                }
               );

var summ = sumation.Sum(x => x.sum);
var summ = db.Companies.Join(
    db.CDIndexes,
    cd => cd.cdin_CompanyId,
    com => Comp_CompanyId,
    (com, cd) => new { com, cd })
  .Where(z=>z.com.comp_idcust.Contains("10319") // Added "LIKE"
    && z.cd.cdin_Status == "InProgress" 
    && z.cd.cdin_startunstufdate != null // Reversed your condition
    && z.cd.cdin_Deleted == null)
  .Sum(z=>z.cd.cdin_ActMortgageAmnt);

当你指向它时,是var Sum。。。在活动行中划线,或者当您观察到null时,您是否已经跨过它?可能重复@KennethK。我所做的就是按F5键,跟踪点变为黄色箭头,调试器点击var summ,这样我按F11键执行一行,然后我指向var summ,它显示summ | nullCompare:cdin_startunstufdate不为null,cd.cdin_startunstufdate==null。你甚至不想用comp_idcust过滤。您的两个查询SQL和LINQ完全不同。@Jamiec非常感谢,我将两个查询处理为相同的。`select new{cddd=cd.cdin\u ActMortgageAmnt==null?0:cd.cdin\u ActMortgageAmnt};`这是否解决了空值的问题?这只是为cdin_ActMortgageAmnt提供了一个默认值,在本例中为0,或者为case和查询中的值。如果仍然为null,则是因为数据不符合指定的条件。另外,您的like语句应该使用Contains comp_idcust进行转换。CONTAINS10319合并不是问题,因为总和只会忽略空值,因此无需事先确保将空值转换为0。问题很可能是他的查询查找的是din_startunstufdate==null而不是!=null,就像他的SQL正在做的一样。Close,但您已经反转了com=>com.Comp_CompanyId,cd=>cd.cdin_CompanyId,,,并且不需要.ToList。@RobertMcKee我是如何反转的?应该是cd=>cd.cdin_CompanyId,com=>com.Comp_CompanyId,内键选择,然后外键您反转了@RobertMcKee answer上的语句,唯一的添加内容是select,这没有道理。复制,paset@Zinov实际上,在我发布我的答案之前,他已经发布了他的答案,所以他没有复制/粘贴我的答案。这是一个很好的答案,只是一些小问题。此外,公司应该在您的模型中具有CDIndexes的导航属性,这将使此查询非常简单。