C# 在C/ASP.NET中,对列求和会导致null
我使用以下sql语句计算列的和: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
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的导航属性,这将使此查询非常简单。