Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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#上的MongoDB入门-查询不起作用_C#_Mongodb_Mongodb Csharp 2.0 - Fatal编程技术网

C#上的MongoDB入门-查询不起作用

C#上的MongoDB入门-查询不起作用,c#,mongodb,mongodb-csharp-2.0,C#,Mongodb,Mongodb Csharp 2.0,我从c#上的MongoDb开始。最后,我需要一个简单的函数来检查用户是否存在于数据库中——就是这样。 我是一个完全的初学者,所以MongoDb教程中的示例自然不起作用 以下是一些例子: public static async Task<List<User>> QueryDB(User u) { var collection = _database.GetCollection<User>("UserData"); var filter = Bu

我从c#上的MongoDb开始。最后,我需要一个简单的函数来检查用户是否存在于数据库中——就是这样。 我是一个完全的初学者,所以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;

}
公共静态异步任务QueryDB(用户u)
{
var collection=_database.GetCollection(“UserData”);
var filter=Builders.filter.Eq(“id”,u.id);
var result=await collection.Find(filter.toListSync();
返回结果;
}

公共静态异步任务QueryDB(用户u)
{
var collection=_database.GetCollection(“UserData”);
var filter=Builders.filter.Eq(“id”,u.id);
var result=await collection.Find(filter.CountAsync();
返回结果;
}
这些功能有什么问题?或者我该怎么称呼他们?因为现在它抛出了一个超时。
没有async/await可以做到这一点吗?我想我不需要它

我建议使用FindAsync,它工作得更好,可以防止c#中的死锁,让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;

  }
公共异步任务查询DB(用户u)
{
var collection=_database.GetCollection(“UserData”);
var filter=Builders.filter.Eq(us=>us.id,u.id);//防止字段名出现错误的最佳实践,如额外字母或大写与小写。
List fetchedUsers=新列表()
使用(var cursor=await collection.FindAsync(过滤器))
{
while(等待cursor.MoveNextAsync())
{
var batch=cursor.Current;
foreach(批量用户)
fetchedUsers.Add(用户);
}
}
返回获取用户;
}
如果您想“前进”,您可以使用此方法来对所有具有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
{
...
}
public async Task QueryDB(此IMongoCollection集合,T实体),其中T:Idable
{
var filter=Builders.filter.Eq(ts=>ts.id,entity.id);
List fetchedData=新列表()
使用(var cursor=await collection.FindAsync(过滤器))
{
while(等待cursor.MoveNextAsync())
{
var batch=cursor.Current;
foreach(批量存储)
fetchedData.Add(res);
}
}
返回获取的数据;
}
可识别接口
{
字符串id{get;};
}
公共类用户:Idable
{
...
}
您现在只需将此方法“附加”到所有集合。
只要创建一个列表,比如说用户类型,然后调用collection.QueryDB(用户u),你就会得到一个具有相同id的所有用户的列表,是的。可能只有1个,但是你可以修改这个方法并使用它。

我建议使用FindAsync,它工作得更好,可以防止c#中的死锁,让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;

  }
公共异步任务查询DB(用户u)
{
var collection=_database.GetCollection(“UserData”);
var filter=Builders.filter.Eq(us=>us.id,u.id);//防止字段名出现错误的最佳实践,如额外字母或大写与小写。
List fetchedUsers=新列表()
使用(var cursor=await collection.FindAsync(过滤器))
{
while(等待cursor.MoveNextAsync())
{
var batch=cursor.Current;
foreach(批量用户)
fetchedUsers.Add(用户);
}
}
返回获取用户;
}
如果您想“前进”,您可以使用此方法来对所有具有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
{
...
}
public async Task QueryDB(此IMongoCollection集合,T实体),其中T:Idable
{
var filter=Builders.filter.Eq(ts=>ts.id,entity.id);
List fetchedData=新列表()
使用(var cursor=await collection.FindAsync(过滤器))
{
while(等待cursor.MoveNextAsync())
{
var batch=cursor.Current;
foreach(批量存储)
fetchedData.Add(res);
}
}
返回获取的数据;
}
可识别接口
{
字符串id{get;};
}
公共类用户:Idable
{
...
}
您现在只需将此方法“附加”到所有集合。

只需创建一个列表,比如说用户类型,然后调用collection.QueryDB(User u),您将得到一个具有相同id的所有用户的列表,是的..可能只有1,但是你可以修改这个方法,然后玩它。

听起来你可能是在玩经典。我可以不使用异步吗?不能使用2.0驱动程序,因为它是异步的。它连接到db后是否会超时,你是否通过控制台或类似mongoVUe的GUI工具测试了连接字符串?从控制台向db查询工作正常,但是你的意思是什么?听起来你可能是在玩经典游戏。我可以不使用异步吗?不使用2.0驱动程序,因为它是异步的。它连接到db后是否会引发超时,你是否通过控制台或类似mongoVUe的GUI工具测试了连接字符串?从控制台查询db工作正常,但你的意思是什么?谢谢!但当我在调用之后从另一个(也使用wait)代码调用这个函数时,调用并没有执行——程序也完成了,这与我之前的函数相同。你知道发生了什么事吗?对不起,我听不懂你说的话。你能再解释一下吗?对不起,我按了回车键)我的评论是:谢谢!但当我在调用之后从另一个(也使用wait)代码调用这个函数时,调用并没有执行——程序也完成了,这与我之前的函数相同。你知道发生了什么吗?也许你正在使用一个控制台应用程序?只需在项目结束时点击Console.Read()。另外,我建议您在调用此方法之前添加一个断点,并检查发生了什么;Console.WriteLine(用户[0]);Console.ReadLine();谢谢但是当我从ca之后的另一个(也使用wait)代码调用此函数时