Начало работы с MongoDB на С# - запрос не работает

45
5

Я начинаю с MongoDb на С#. В конце мне нужна функция, которая просто проверяет, существует ли пользователь в DB -thats. Я полный новичок, поэтому естественно, что пример из учебника MongoDb не работает, вот примеры:

public  static async Task<List<User>> QueryDB(User u)
{
var collection = _database.GetCollection<User>("UserData");
var filter = Builders<User>.Filter.Eq("id", u.id);
var result = await collection.Find(filter).ToListAsync();
return result;

}

или

public  static async Task<long> QueryDB(User u)
{
var collection = _database.GetCollection<User>("UserData");
var filter = Builders<User>.Filter.Eq("id", u.id);
var result = await collection.Find(filter).CountAsync();
return result;

}

Что не так с этими функциями? Или как мне их называть? Потому что теперь он выдает тайм-аут. Можно ли это сделать без async/wait? Думаю, мне это не нужно

спросил(а) 2015-10-04T15:31:00+03:00 4 года, 2 месяца назад
1
Решение
67

Я бы предложил использовать FindAsync, он работает лучше, и вы предотвращаете взаимоблокировки в С# и позволяете mongo выполнять свою работу.

public async Task<List<User>> QueryDB(User u)
{
var collection = _database.GetCollection<User>("UserData");
var filter = Builders<User>.Filter.Eq(us => us.id, u.id); //best practice to prevent errors on field name such as extra letter or capital vs lowercase.
List<User> fetchedUsers = new List<User>()
using (var cursor = await collection.FindAsync(filter))
{
while (await cursor.MoveNextAsync())
{
var batch = cursor.Current;
foreach (User user in batch)
fetchedUsers.Add(user);
}
}
return fetchedUsers;

}

если вы хотите "продвинуться", вы можете использовать этот метод для всех классов, имеющих поле id

public async Task<List<T>> QueryDB(this IMongoCollection<T> collection, T entity) where T : Idable
{
var filter = Builders<T>.Filter.Eq(ts => ts.id, entity.id);
List<T> fetchedData = new List<T>()
using (var cursor = await collection.FindAsync(filter))
{
while (await cursor.MoveNextAsync())
{
var batch = cursor.Current;
foreach (T res in batch)
fetchedData.Add(res);
}
}
return fetchedData;

}

interface Idable
{
string id {get;};
}

public class User : Idable
{
...
}

вы просто используете этот метод для всех ваших коллекций. просто создайте список, скажем тип пользователя и вызовите collection.QueryDB(User u), и вы получите список всех пользователей с одинаковым идентификатором, да.. возможно только 1, но вы можете изменить этот метод и просто играть с этим.

ответил(а) 2015-10-04T16:45:00+03:00 4 года, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема