Использование результатов за пределами dbContext в VB.NET - PullRequest
1 голос
/ 23 марта 2012

Допустим, у меня есть такой код:

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?Так как результаты «исчезают» после выполнения End Using?

Ответы [ 3 ]

2 голосов
/ 23 марта 2012

Вам нужно будет объявить обе переменные вне операторов 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
2 голосов
/ 24 марта 2012

Главное здесь - знать, когда ваши запросы 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           

Теперь вы выполнили запросы и сохранили результаты в памяти до того, как контексты были расположены, и вы можете счастливо делать с ними то, что хотите.

1 голос
/ 23 марта 2012

В C # я просто вкладываю обычные слова ...

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

  }
}

Проверьте это для использования вложений в VB ...

Вложено с помощью операторов

...