C# 如何在没有打开DataReader错误的情况下循环2个嵌套记录集?
我的设置:带有附加sql数据库的asp.net mvc web应用程序 给出3个示例表,例如: 其中,我必须获得给定合同的所有发票列表,以及所售项目的总发票金额(单位金额*单价) 我尝试了以下控制器操作:C# 如何在没有打开DataReader错误的情况下循环2个嵌套记录集?,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我的设置:带有附加sql数据库的asp.net mvc web应用程序 给出3个示例表,例如: 其中,我必须获得给定合同的所有发票列表,以及所售项目的总发票金额(单位金额*单价) 我尝试了以下控制器操作: public IEnumerable<Invoice> Get(int contractId) { IEnumerable<Invoice> invoices = db.Invoices.Where(i => i.Contract
public IEnumerable<Invoice> Get(int contractId)
{
IEnumerable<Invoice> invoices = db.Invoices.Where(i => i.ContractId == invoiceId);
foreach (var invoice in invoices){
var items = db.Items.Where(t => t.InvoiceId == invoice.InvoiceId);
foreach (var item in items){
invoice.Total += item.UnitsSold * item.UnitPrice;
}
}
return invoices;
}
我选择ToList()方法是因为它有效。导航属性的方法也很有效,但在那里我还使用了ToList(),以便能够提交外部循环中Invoice.Total字段的数据库更改。
从文件本身
ToList(IEnumerable)方法强制立即执行查询求值,并返回包含查询结果的列表。您可以将此方法附加到查询中,以获取查询结果的缓存副本
在编辑属性之前,必须先将连接到数据源的IEnumerable上的操作传输到内存/缓存
public List<Invoice> Get(int contractId)
{
List<Invoice> invoices = db.Invoices.Where(i => i.ContractId == invoiceId).ToList();
foreach (var invoice in invoices){
var items = db.Items.Where(t => t.InvoiceId == invoice.InvoiceId).ToList();
foreach (var item in items){
invoice.Total += item.UnitsBought * item.UnitPrice;
}
}
return invoices;
}
public List Get(int-construcd)
{
List invoices=db.invoices.Where(i=>i.contract==invoiceId.ToList();
foreach(发票中的var发票){
var items=db.items.Where(t=>t.InvoiceId==invoice.InvoiceId.ToList();
foreach(项目中的var项目){
发票.Total+=item.unitsbound*item.UnitPrice;
}
}
退回发票;
}
从文件本身
ToList(IEnumerable)方法强制立即执行查询求值,并返回包含查询结果的列表。您可以将此方法附加到查询中,以获取查询结果的缓存副本
在编辑属性之前,必须先将连接到数据源的IEnumerable上的操作传输到内存/缓存
public List<Invoice> Get(int contractId)
{
List<Invoice> invoices = db.Invoices.Where(i => i.ContractId == invoiceId).ToList();
foreach (var invoice in invoices){
var items = db.Items.Where(t => t.InvoiceId == invoice.InvoiceId).ToList();
foreach (var item in items){
invoice.Total += item.UnitsBought * item.UnitPrice;
}
}
return invoices;
}
public List Get(int-construcd)
{
List invoices=db.invoices.Where(i=>i.contract==invoiceId.ToList();
foreach(发票中的var发票){
var items=db.items.Where(t=>t.InvoiceId==invoice.InvoiceId.ToList();
foreach(项目中的var项目){
发票.Total+=item.unitsbound*item.UnitPrice;
}
}
退回发票;
}
<>代码> 这是因为项目.gEngerError()需要运行SQL查询并开始获取结果,但是发票正处于读取数据库结果的中间。而且(通常)不能在同一数据库连接上同时运行两个不同的查询。在运行新查询之前,需要将第一个查询结果一直读取到最后。此时修改只发生在内存中,稍后将通过调用db.SaveChanges()保存到数据库中。我意识到这个答案来自@DavidBrowne微软的评论,部分来自@JerdineSabio的回答。我只是觉得这个问题需要答案和所有相关的信息加以整合
选项1:使用ToList()将查询加载到内存中
public List<Invoice> Get(int contractId)
{
List<Invoice> invoices = db.Invoices.Where(i => i.ContractId == invoiceId).ToList();
foreach (var invoice in invoices){
var items = db.Items.Where(t => t.InvoiceId == invoice.InvoiceId).ToList();
foreach (var item in items){
invoice.Total += item.UnitsBought * item.UnitPrice;
}
}
return invoices;
}
public List Get(int-construcd)
{
List invoices=db.invoices.Where(i=>i.contract==invoiceId.ToList();
foreach(发票中的var发票){
var items=db.items.Where(t=>t.InvoiceId==invoice.InvoiceId.ToList();
foreach(项目中的var项目){
发票.Total+=item.unitsbound*item.UnitPrice;
}
}
退回发票;
}
选项2:(推荐)包括初始查询中需要的项目。(假设发票上有导航属性)
public IEnumerable Get(int-construcd)
{
IEnumerable invoices=db.invoices.Include(i=>i.Items)。其中(i=>i.contracted==invoiceId);
foreach(发票中的var发票){
var项目=发票。项目;
foreach(项目中的var项目){
发票.Total+=item.unitsbound*item.UnitPrice;
}
}
退回发票;
}
<>代码> 这是因为项目.gEngerError()需要运行SQL查询并开始获取结果,但是发票正处于读取数据库结果的中间。而且(通常)不能在同一数据库连接上同时运行两个不同的查询。在运行新查询之前,需要将第一个查询结果一直读取到最后。此时修改只发生在内存中,稍后将通过调用db.SaveChanges()保存到数据库中。我意识到这个答案来自@DavidBrowne微软的评论,部分来自@JerdineSabio的回答。我只是觉得这个问题需要答案和所有相关的信息加以整合
选项1:使用ToList()将查询加载到内存中
public List<Invoice> Get(int contractId)
{
List<Invoice> invoices = db.Invoices.Where(i => i.ContractId == invoiceId).ToList();
foreach (var invoice in invoices){
var items = db.Items.Where(t => t.InvoiceId == invoice.InvoiceId).ToList();
foreach (var item in items){
invoice.Total += item.UnitsBought * item.UnitPrice;
}
}
return invoices;
}
public List Get(int-construcd)
{
List invoices=db.invoices.Where(i=>i.contract==invoiceId.ToList();
foreach(发票中的var发票){
var items=db.items.Where(t=>t.InvoiceId==invoice.InvoiceId.ToList();
foreach(项目中的var项目){
发票.Total+=item.unitsbound*item.UnitPrice;
}
}
退回发票;
}
选项2:(推荐)包括初始查询中需要的项目。(假设发票上有导航属性)
public IEnumerable Get(int-construcd)
{
IEnumerable invoices=db.invoices.Include(i=>i.Items)。其中(i=>i.contracted==invoiceId);
foreach(发票中的var发票){
var项目=发票。项目;
foreach(项目中的var项目){
发票.Total+=item.unitsbound*item.UnitPrice;
}
}
退回发票;
}
这是否回答了您的问题?这有助于理解错误的原因您是否尝试在连接字符串中设置MultipleActiveResultSets=True?这是否回答了您的问题?这有助于理解错误的原因您是否尝试在连接字符串中设置MultipleActiveResultSets=True?为什么这样可以解决问题?首先是什么问题?任何描述和解释都会大大改善你的答案。为什么这能解决问题