我对子查询有一个非常奇怪的情况。 计算子查询的值,但赋予属性的值不同
var ozForAllViews = from oz in dbContext.oz
where
oz.TId == 6050
select
new ozForAllView
{
ozId = oz.ozId,
Ilosc = oz.Ilosc - (from pz in dbContext.pz
where
pz.Aktywny &&
pz.ozId == oz.ozId
select pz).Sum(z=> (decimal?) z.Ilosc) ?? 0
};
我的属性Ilosc未正确计算,DB中的值等于5。 但返回值始终为0。 为什么不从子查询中减去oz.Ilosc? 我的意思是5 - 0应该等于5。
答案 0 :(得分:1)
您应该用括号括起计算减去量的表达式:
Dim cmd As New OleDbCommand
Dim connp As New OleDbConnection
Dim da As New OleDbDataAdapter
Dim ds As New DataSet
Dim strsql As String
Dim strreprotname As String
Try
connp.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Application.StartupPath & "\report.mdb; Jet OLEDB:Database Password=KNOZ1003"
connp.Open()
ds.Reset()
strsql = "select * from tab3"
cmd.CommandText = strsql
cmd.Connection = connp
da.SelectCommand = cmd
da.Fill(ds)
strreprotname = "cashrpt"
Dim strreportpath As String = Application.StartupPath & "\Reports\" & strreprotname & ".rpt"
Dim rptdocument As New CrystalDecisions.CrystalReports.Engine.ReportDocument
Dim prnset As New Printing.PrinterSettings
Dim pg As New Printing.PageSettings
rptdocument.Load(strreportpath)
rptdocument.SetDataSource(ds.Tables(0))
rptdocument.SetDatabaseLogon("", "", "", Application.StartupPath + "\report.mdb")
prnset.PrinterName = cashprinter
rptdocument.PrintToPrinter(prnset, pg, False)
cmd.Dispose()
connp.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
这是因为查询被翻译成SQL。在SQL中,如果表达式的一部分是from oz in dbContext.oz
where oz.TId == 6050
select
new ozForAllView
{
ozId = oz.ozId,
Ilosc = oz.Ilosc - ((from pz in dbContext.pz
where
pz.Aktywny &&
pz.ozId == oz.ozId
select pz).Sum(z=> (decimal?) z.Ilosc) ?? 0)
};
,则整个表达式为null。您的查询被翻译为null
被评估为一个表达式。当减去的金额为空时,该部分变为oz.Ilosc - (from ... (decimal?) z.Ilosc)
,因此它将作为null
返回。
令人困惑,因为在简单的C#代码中,行为会有所不同。 0
部分仅适用于减去的金额。