Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在没有打开DataReader错误的情况下循环2个嵌套记录集?_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# 如何在没有打开DataReader错误的情况下循环2个嵌套记录集?

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

我的设置:带有附加sql数据库的asp.net mvc web应用程序

给出3个示例表,例如:

其中,我必须获得给定合同的所有发票列表,以及所售项目的总发票金额(单位金额*单价)

我尝试了以下控制器操作:

    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?为什么这样可以解决问题?首先是什么问题?任何描述和解释都会大大改善你的答案。为什么这能解决问题