在VB.NET中使用dbContext之外的结果

时间:2012-03-23 17:52:38

标签: asp.net vb.net entity-framework entity-framework-4 linq-to-entities

假设我有这样的代码:

Using dbContext as mydb_entities = New mydb_entities
   Dim qperson = (From p in dbContext.People _
                  Where p.name = "John" _
                  Select p)
End Using
Using dbContext as yourdb_entities = New yourdb_entities
   Dim qyou = (From p in dbContext.Customer _
               Where p.name = "John" _
               Select p)
End Using

如何比较qperson和qyou的结果?由于结果"消失"一旦执行结束使用?

3 个答案:

答案 0 :(得分:2)

您需要在using语句

之外声明两个变量
Dim qperson As IQueryable(Of Person)
Dim qyou As IQueryable(Of Customer)

Using dbContext as mydb_entities = New mydb_entities
   qperson = (From p in dbContext.People _
              Where p.name = "John" _
              Select p)
End Using
Using dbContext as yourdb_entities = New yourdb_entities
   qyou = (From p in dbContext.Customer _
           Where p.name = "John" _
           Select p)
End Using

答案 1 :(得分:2)

这里的关键是知道你的LINQ查询什么时候开始运行。当执行这行代码时:

qperson = (From p in dbContext.People _ 
          Where p.name = "John" _ 
          Select p) 

没有向服务器发送查询。相反,您将获得一个实现IQueryable(Of T)接口的对象,该接口描述了查询的内容。在您开始使用结果之前,查询实际上并未发送到服务器并执行,例如在For Each循环中。这称为延迟执行,是LINQ的基础。

那么这对你意味着什么?嗯,这意味着在执行查询之前不得处置上下文。在到目前为止的例子中,这不一定总是正确的。 (嵌套的答案可能会这样做,具体取决于嵌套使用内部实际发生的情况。)

处理此问题的典型方法是强制执行查询以在处置上下文之前生成结果的内存中集合。 ToList()扩展方法是执行此操作的常用方法。所以,例如:

Dim qperson As IList(Of Person)           
Dim qyou As IList(Of Customer)           

Using dbContext as mydb_entities = New mydb_entities           
   qperson = (From p in dbContext.People _           
              Where p.name = "John" _           
              Select p).ToList()
End Using           

Using dbContext as yourdb_entities = New yourdb_entities           
   qyou = (From p in dbContext.Customer _           
           Where p.name = "John" _           
           Select p).ToList()
End Using           

现在你已经执行了查询并在上下文处理之前将结果存入内存,你可以愉快地用它们做你想做的事。

答案 2 :(得分:1)

在C#中我通常只是嵌套使用...

using (var context blahentities())
{
  using (var context2 blahentities())
  {

  }
}

在vb ...

中检查这个用于嵌套的用法

Nested using statements