EF查询多次击中数据库

时间:2019-01-10 18:02:44

标签: vb.net entity-framework

也许是一个简单的问题,但我对EF还是很陌生,所以:

我有这个查询:

                Dim InvoicesQuery = (From i As Invoice In dbContext.Invoices.AsNoTracking() Where i.InvoiceNumber = -1
                             Select New InvoicesWithDetails With {
                                        .InvoiceDetails = i.InvoicesDetails,
                                        .InvoiceDetailsUnmerged = i.InvoicesDetailsUnmergeds,
                                        .Examination = Nothing,
                                        .Applicant = Nothing,
                                        .InvoiceNumber = i.InvoiceNumber,
                                        .InvoiceYear = i.InvoiceYear,
                                        .DocCode = i.DocCode,
                                        .CompanyId = i.CompanyId,
                                        .InvoiceDate = i.InvoiceDate,
                                        .NetAmount = i.NetAmount,
                                        .AmountPaid = i.AmountPaid,
                                        .AmountToPay = i.AmountToPay,
                                        .VAT = i.VAT,
                                        .AdditionalTax = i.AdditionalTax,
                                        .Status = i.Status,
                                        .Amount = i.Amount,
                                        .ExaminationId = i.ExaminationId,
                                        .ReceiverName = If(i.OtherReceiverName Is Nothing, i.ReceiverName, i.OtherReceiverName),
                                        .ReceiverAddress = If(i.OtherReceiverAddress Is Nothing, i.ReceiverAddress, i.OtherReceiverAddress),
                                        .ReceiverCity = If(i.OtherReceiverCity Is Nothing, i.ReceiverCity, i.OtherReceiverCity),
                                        .ReceiverTaxCode = If(i.OtherReceiverTaxCode Is Nothing, i.ReceiverTaxCode, i.OtherReceiverTaxCode),
                                        .ReceiverCompanyTaxCode = i.ReceiverCompanyTaxCode,
                                        .ReceiverZipCode = If(i.OtherReceiverZipCode Is Nothing, i.ReceiverZipCode, i.OtherReceiverZipCode),
                                        .IsCreditNote = i.IsCreditNote,
                                        .HasCreditNote = i.HasCreditNote,
                                        .FixedAdditionalAmountOnInvoice = i.FixedAdditionalAmountOnInvoice,
                                        .CashFlowPaymentModeId = If(i.CashFlowPaymentModeId IsNot Nothing, i.CashFlowPaymentModeId.Trim, Nothing),
                                        .AgreementDeductible = i.AgreementDeductible,
                                        .IsPatientInvoiceRecipient = i.IsPatientInvoiceRecipient,
                                        .IsApplicantInvoiceRecipient = i.IsApplicantInvoiceRecipient,
                                        .IsDoctorInvoiceRecipient = i.IsDoctorInvoiceRecipient,
                                        .DoctorId = If(i.DoctorId IsNot Nothing, i.DoctorId, Nothing),
                                        .Doctor = Nothing,
                                        .CreditNoteParentInvoice = i.CreditNoteParentInvoice,
                                        .CreditNoteParentInvoiceYear = i.CreditNoteParentInvoiceYear,
                                        .IsDeferredInvoice = i.IsDeferredInvoice,
                                        .IsExtracted = If(i.IsExtracted IsNot Nothing, i.IsExtracted, False),
                                        .IsExportedToHOST = If(i.IsExportedToHOST IsNot Nothing, i.IsExportedToHOST, False),
                                        .ApplicantId = i.ApplicantId,
                                        .InvoiceHasVAT = i.InvoiceHasVAT,
                                        .VAT_Percentage = i.VAT_Percentage,
                                        .IssuedBy = i.IssuedBy,
                                        .MaskedCounter = i.MaskedCounter,
                                        .DocTypeId = i.DocTypeId,
                                        .OtherReceiverName = i.OtherReceiverName,
                                        .OtherReceiverAddress = i.OtherReceiverAddress,
                                        .OtherReceiverCity = i.OtherReceiverCity,
                                        .OtherReceiverTaxCode = i.OtherReceiverTaxCode,
                                        .OtherReceiverZipCode = i.OtherReceiverZipCode,
                                        .CashFlows = i.CashFlows}).ToList

InvoicesWithDetails是一个继承Invoice的类;发票是数据库实体

此调用后,我将遍历以下结果:

            For Each i As InvoicesWithDetails In InvoicesQuery.Where(Function(iwd) iwd.CompanyDescription Is Nothing And iwd.CompanyId IsNot Nothing)
            i.CompanyDescription = ReturnCompanyDescription(i.CompanyId)
        Next

对于循环中的每个循环,都会调用数据库。 我认为在第一次调用.ToList之后,我可以迭代结果而无需调用数据库。

怎么了? 预先感谢

好的,我为此做了更多工作,尝试了另一种方法:

这是针对发票实体的新查询:

                            Dim InvoicesQuery As List(Of Invoice)
                        InvoicesQuery = (From i As Invoice In dbContext.Invoices.AsNoTracking Where
                                 i.InvoiceDate >= FromDate And i.InvoiceDate <= ToDate).ToList

此后,我创建了一个InvoiceWithDetails的新等距并设置所有属性,如下所示:

            For Each i As Invoice In InvoicesQuery
            Dim newInvoiceWithDetails As New InvoicesWithDetails
            With newInvoiceWithDetails
                .InvoiceDetails = i.InvoicesDetails
                .InvoiceDetailsUnmerged = i.InvoicesDetailsUnmergeds
                .Examination = Nothing
                .Applicant = Nothing
                .InvoiceNumber = i.InvoiceNumber
                .InvoiceYear = i.InvoiceYear
                .DocCode = i.DocCode
                .CompanyId = i.CompanyId
                .InvoiceDate = i.InvoiceDate
                .NetAmount = i.NetAmount
                .AmountPaid = i.AmountPaid
                .AmountToPay = i.AmountToPay
                .VAT = i.VAT
                .AdditionalTax = i.AdditionalTax
                .Status = i.Status
                .Amount = i.Amount
                .ExaminationId = i.ExaminationId
                .ReceiverName = If(i.OtherReceiverName Is Nothing, i.ReceiverName, i.OtherReceiverName)
                .ReceiverAddress = If(i.OtherReceiverAddress Is Nothing, i.ReceiverAddress, i.OtherReceiverAddress)
                .ReceiverCity = If(i.OtherReceiverCity Is Nothing, i.ReceiverCity, i.OtherReceiverCity)
                .ReceiverTaxCode = If(i.OtherReceiverTaxCode Is Nothing, i.ReceiverTaxCode, i.OtherReceiverTaxCode)
                .ReceiverCompanyTaxCode = i.ReceiverCompanyTaxCode
                .ReceiverZipCode = If(i.OtherReceiverZipCode Is Nothing, i.ReceiverZipCode, i.OtherReceiverZipCode)
                .IsCreditNote = i.IsCreditNote
                .HasCreditNote = i.HasCreditNote
                .FixedAdditionalAmountOnInvoice = i.FixedAdditionalAmountOnInvoice
                .CashFlowPaymentModeId = If(i.CashFlowPaymentModeId IsNot Nothing, i.CashFlowPaymentModeId.Trim, Nothing)
                .AgreementDeductible = i.AgreementDeductible
                .IsPatientInvoiceRecipient = i.IsPatientInvoiceRecipient
                .IsApplicantInvoiceRecipient = i.IsApplicantInvoiceRecipient
                .IsDoctorInvoiceRecipient = i.IsDoctorInvoiceRecipient
                .DoctorId = If(i.DoctorId IsNot Nothing, i.DoctorId, Nothing)
                .Doctor = Nothing
                .CreditNoteParentInvoice = i.CreditNoteParentInvoice
                .CreditNoteParentInvoiceYear = i.CreditNoteParentInvoiceYear
                .IsDeferredInvoice = i.IsDeferredInvoice
                .IsExtracted = If(i.IsExtracted IsNot Nothing, i.IsExtracted, False)
                .IsExportedToHOST = If(i.IsExportedToHOST IsNot Nothing, i.IsExportedToHOST, False)
                .ApplicantId = i.ApplicantId
                .InvoiceHasVAT = i.InvoiceHasVAT
                .VAT_Percentage = i.VAT_Percentage
                .IssuedBy = i.IssuedBy
                .MaskedCounter = i.MaskedCounter
                .DocTypeId = i.DocTypeId
                .OtherReceiverName = i.OtherReceiverName
                .OtherReceiverAddress = i.OtherReceiverAddress
                .OtherReceiverCity = i.OtherReceiverCity
                .OtherReceiverTaxCode = i.OtherReceiverTaxCode
                .OtherReceiverZipCode = i.OtherReceiverZipCode
                .CashFlows = i.CashFlows
            End With
            FinalList.Add(newInvoiceWithDetails)

对于每个周期和每个属性值,都会调用数据库

再次,怎么了?

0 个答案:

没有答案