2015-11-10 3 views
0

Я знаю, что var является только областью действия внутри его метода. Но я столкнулся с ситуацией, когда коллекция «var» из метода подключения к базе данных должна быть доступна в последующем методе Query(), чтобы сделать запрос.Как ссылаться на 'var' от одного метода в другом?

Специфическая ошибка: The name collection doesn't exist in the current context

Я ссылающийся на MongoDB C# driver docs для того, чтобы установить соединение и запрос, и все кажется правильным, кроме этого вопроса.

Кто-нибудь знает, как я могу реструктурировать свой код для устранения ошибки?

Моих два метода определены следующим образом в классе OrderRespository, что делает соединение с базой данных и запросы:

//Method to create MongoDB Orders connection and get handle on collections 
    public static bool CreateConnection() 
    { 

     var client = new MongoClient(connectionString); 

     try 
     { 
      var database = client.GetDatabase("orders"); 
      //Get a handle on the customers collection: 
      var collection = database.GetCollection<BsonDocument>("customers"); 
     } 
     catch(MongoConnectionException) 
     { 
      return false; 
     } 

     return true; 
    } 



    //Method to test query on database documents 
    public async static Task<List<Customer>> FindCustomers() 
    { 
     var documents = await collection.Find(new BsonDocument()).ToListAsync(); 
     List<Customer> customerList = await documents.ToListAsync(); 

     return await documents.ToListAsync(); 

    } 

И это клиент Модель ПОКО класс моделирует поля коллекции:

public class Customer 
    { 
     /// <summary> 
     /// This attribute is used to map the Id property to the ObjectId in the collection 
     /// </summary> 
     [BsonId] 
     public ObjectId Id { get; set; } 

     [BsonElement("firstName")] 
     public string firstName { get; set; } 

     [BsonElement("lastName")] 
     public string lastName { get; set; } 

     [BsonElement("email")] 
     public string Email { get; set; } 

    } 
+0

Вы пытались объявить переменную вне методов прямо в определении OrderRepository? Это должно дать ему глобальный охват. – Tim

+0

Сделать это статическим свойством (или полем) класса (с соответствующим типом, а не 'var') или передать его из одного метода другому в качестве аргумента. –

ответ

3

CreateConnection должен вернуть коллекцию, которая создает, так что человек, создающий соединение, действительно может его использовать:

//Consider renaming this method; you're really here to get the customers, 
//not create a connection 
public static YourCollectionType<BsonDocument> CreateConnection() 
{ 
    var client = new MongoClient(connectionString); 
    var database = client.GetDatabase("orders"); 
    //Get a handle on the customers collection: 
    return database.GetCollection<BsonDocument>("customers"); 
} 

FindCustomers может затем принять коллекцию в качестве параметра:

public async static Task<List<Customer>> FindCustomers(
    YourCollectionType<BsonDocument> collection) 
{ 
    var documents = await collection.Find(new BsonDocument()).ToListAsync(); 
    List<Customer> customerList = await documents.ToListAsync(); 

    return await documents.ToListAsync(); 
} 

Вы можете использовать CreateConnection для создания документов, которые вы искать через:

var customers = FindCustomers(CreateConnection()); 

Если FindCustomers является то, что бы только когда-либо иметь смысл использовать с коллекцией, созданной CreateConnection, и вы никогда не будете использовать созданный объект для чего-либо еще, тогда вы можете иметь FindCustomer звонок CreateConnection напрямую, но шансы на эти условия не будут применяться.

+0

Я попытался реализовать вышеизложенное и вычислил его IMongoCollection, который является типом, требуемым Api ref. У меня все еще есть две ошибки, которые я не уверен ... в этой пасте: http://hastebin.com/jeletobese.php @Servy –

+1

@BrianJ У меня была опечатка в моей первоначальной версии; Некоторое время назад я редактировал сообщение, чтобы исправить это. – Servy

+0

Обновлено. Теперь вы можете изменить текст выше, ToListAsync() не существует в документе. Поэтому я изменил это на ToList() и удалил записи ожидания. Но у меня все еще есть один набор ошибок, в которых говорится о неявной ошибке преобразования. Это обновленная паста с подробным описанием ошибки: http://hastebin.com/huwabiraji.tex –

Смежные вопросы