Драйвер C # Mongo - проблема с FindAsync - PullRequest
0 голосов
/ 18 сентября 2018

Я создавал базовое приложение MVC и получил несколько затруднений.Основным является подключение и поиск чего-то в mongodb.Я также пытался реализовать дженерики.Ниже я предоставил некоторый код, чтобы показать вам, что я пытаюсь реализовать.Я считаю, что моя проблема заключается в получении правильной коллекции из базы данных, но затем я столкнулся с проблемой преобразования T в User.

Я искал разные способы, чтобы попытаться это выяснить, но я был в тупике довольно давно.Я реализовал функцию Create, которая использует функцию ConnectToMongo, и она работает нормально, но когда я пытаюсь реализовать выражение find или findbyexpress и сталкиваюсь с этими ошибками.Я надеюсь, что кто-то может указать мне правильное направление, спасибо.

    /// <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
}

1 Ответ

0 голосов
/ 19 сентября 2018

Мне нужно было изменить эту строку

result = (T)await collection.FindAsync(filterDefinition);

на эту строку

var results = await collection.Find(filterDefinition).ToListAsync();
result = results.FirstOrDefault();

Он пытался привести IAsyncCursor к T.

...