C#Mongo驱动程序-FindAsync问题
我一直在构建一个基本的MVC应用程序,但在一些事情上遇到了难题。最主要的一个是在mongodb中连接并找到一些东西。我也一直在尝试实现泛型。下面我提供了一些代码,向您展示了我试图实现的内容。我认为我的问题是从数据库中获取正确的集合,但接下来我遇到的问题是从T到用户的转换 我一直在尝试用不同的方法来解决这个问题,但我已经被难住了很长一段时间了。我实现了一个Create函数,它使用了“ConnectToMongo”函数,这个函数工作得很好,但是当我尝试实现find或findbyexpression时,遇到了这些错误。我希望有人能给我指出正确的方向,谢谢C#Mongo驱动程序-FindAsync问题,c#,mongodb,generics,mongodb-.net-driver,C#,Mongodb,Generics,Mongodb .net Driver,我一直在构建一个基本的MVC应用程序,但在一些事情上遇到了难题。最主要的一个是在mongodb中连接并找到一些东西。我也一直在尝试实现泛型。下面我提供了一些代码,向您展示了我试图实现的内容。我认为我的问题是从数据库中获取正确的集合,但接下来我遇到的问题是从T到用户的转换 我一直在尝试用不同的方法来解决这个问题,但我已经被难住了很长一段时间了。我实现了一个Create函数,它使用了“ConnectToMongo”函数,这个函数工作得很好,但是当我尝试实现find或findbyexpression时
/// <summary>
/// Finds the object by expression.
/// </summary>
/// <returns>The object by expression.</returns>
/// <param name="entity">Entity.</param>
/// <param name="expression">Expression.</param>
/// <typeparam name="T">The 1st type parameter.</typeparam>
private async Task<T> FindObjectByExpression<T>(T entity, Expression<Func<T, bool>> expression)
{
T result;
try
{
var collection = this.ConnectToMongo(entity);
if (collection == null)
{
Console.WriteLine($"Collection: {entity.GetType()} does not exsit.");
return default(T);
}
var filterDefinition = Builders<T>.Filter.Where(expression);
result = (T)await collection.FindAsync(filterDefinition);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return default(T);
}
return result;
}
/// <summary>
/// Connects to mongo.
/// </summary>
/// <returns>The to mongo.</returns>
/// <param name="entity">Entity.</param>
private IMongoCollection<T> ConnectToMongo<T>(T entity)
{
IMongoCollection<T> collection = null;
try
{
MongoClientSettings setting = new MongoClientSettings
{
Server = new MongoServerAddress("localhost", 27017)
};
MongoClient client = new MongoClient(setting);
var mongoDbServer = client.GetDatabase(DBName);
collection = mongoDbServer.GetCollection<T>($"{entity.GetType().Name}");
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
return collection;
}
public abstract class Command
{
public Command(Guid? ID)
{
if(ID == null)
{
ID = Guid.NewGuid();
}
else
{
this.ID = ID.Value;
}
}
[BsonId]
public Guid ID { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}
public class User : Command
{
public User(Guid? Id)
: base(Id)
{
this.classDictionary = new Dictionary<string, string>();
}
[Required]
public Entitlement UserEntitlement { get; set; }
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
[Required]
public string UniID { get; set; }
// Maps from Course ID to Section ID
public Dictionary<string, string> classDictionary { get; set; }
}
public enum Entitlement
{
Student = 10,
Admin = 20,
Bot = 30,
Unknown = 0
}
//
///通过表达式查找对象。
///
///通过表达式定义对象。
///实体。
///表情。
///第一个类型参数。
专用异步任务FindObjectByExpression(T实体,表达式)
{
T结果;
尝试
{
var collection=this.ConnectToMongo(实体);
if(集合==null)
{
WriteLine($“集合:{entity.GetType()}不存在。”);
返回默认值(T);
}
var filterDefinition=Builders.Filter.Where(表达式);
结果=(T)wait collection.FindAsync(filterDefinition);
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
返回默认值(T);
}
返回结果;
}
///
///连接到mongo。
///
///这条路通往蒙哥。
///实体。
私人IMongoCollection ConnectToMongo(T实体)
{
IMongoCollection=null;
尝试
{
MongoClient设置=新的MongoClient设置
{
服务器=新的MongoServer地址(“localhost”,27017)
};
MongoClient=新的MongoClient(设置);
var mongoDbServer=client.GetDatabase(DBName);
collection=mongoDbServer.GetCollection($“{entity.GetType().Name}”);
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
回收;
}
公共抽象类命令
{
公共命令(Guid?ID)
{
if(ID==null)
{
ID=Guid.NewGuid();
}
其他的
{
this.ID=ID.值;
}
}
[BsonId]
公共Guid ID{get;set;}
公共字符串电子邮件{get;set;}
公共字符串密码{get;set;}
}
公共类用户:命令
{
公共用户(Guid?Id)
:base(Id)
{
this.classDictionary=新字典();
}
[必需]
公共授权用户授权{get;set;}
[必需]
公共字符串名{get;set;}
[必需]
公共字符串LastName{get;set;}
[必需]
公共字符串UniID{get;set;}
//从课程ID映射到分区ID
公共字典类字典{get;set;}
}
公共枚举权利
{
学生=10,
管理员=20,
Bot=30,
未知=0
}
我需要更改此行
result = (T)await collection.FindAsync(filterDefinition);
var results = await collection.Find(filterDefinition).ToListAsync();
result = results.FirstOrDefault();
这条线
result = (T)await collection.FindAsync(filterDefinition);
var results = await collection.Find(filterDefinition).ToListAsync();
result = results.FirstOrDefault();
它试图向T投射一个IAsyncursor