在Entity Framework中添加子查询的值

时间:2016-03-18 15:52:34

标签: entity-framework

我对子查询有一个非常奇怪的情况。 计算子查询的值,但赋予属性的值不同

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。

1 个答案:

答案 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部分仅适用于减去的金额。