簡體   English   中英

如何在C#類的計算字段上過濾Bson Document?

[英]How to filter Bson Document on a computed field of a C# class?

我有幾個需要存儲在MongoDb集合中的類,這些類具有公共基類和定義公共字段的公共接口。 每個類都有一個具有相同名稱但具有不同實現的計算字段。 當我嘗試查詢該字段時,我收到一條消息,提示不支持該字段

我正在使用最新的MongoDb驅動程序在.Net Core 2.2控制台應用程序上運行此程序

接口:

 public interface ITask
    {
        ObjectId Id { get; set; }
        TaskStatus Status { get; set; }
        DateTime Timestamp { get; set; }
        string UserId { get; set; }
        string ComputedField{ get; }
    }

基類:

public abstract class BaseTask : ITask
    {
        [BsonId(IdGenerator = typeof(ObjectIdGenerator))]
        public ObjectId Id { get; set; }
        [BsonElement("Status")]
        public TaskStatus Status { get; set; }
        [BsonElement("Timestamp")]
        public DateTime Timestamp { get; set; }
        [BsonElement("UserId")]
        public string UserId { get; set; }
        public virtual string ComputedField
        {
            get { return CalculateMD5Hash(Id.ToString()); }
        }
}

給我問題的實際課堂

public class MyTask : BaseTask
    {

        [BsonElement("Field1")]
        public Guid Field1{ get; set; }


        [BsonElement("ComputedField")]
        public override string ComputedField
        {
            get { return CalculateMD5Hash($"ABC{Field1.ToString()}"); } 
        }

    }

調用MongoDb層的包裝器

public class TaskService<T> : ITaskService<T> where T : ITask
    {
        private readonly IPersistanceLayer<ObjectId, object> _pl;


        public async Task<T> GetNextTask(string key)
        {
              var oee = _pl.Mongo.Filter<T>(x => x.ConcurrencyKey==key 
                , typeof(T).Name).OrderBy(x=> x.Timestamp).FirstOrDefault();
            return oee;
        }

    }

MongoDb層

 public IEnumerable<T> Filter<T>(System.Linq.Expressions.Expression<Func<T, bool>> lambda, string collection)
        {
            var filter = Builders<T>.Filter.Where(lambda);

            return _db.GetCollection<T>(collection).Find(filter).ToList();
        }

我得到的錯誤是

[ERR] {document}.ComputedField is not supported.

在集合中,當我插入文檔時,我看到保存的文檔,但是計算字段的值正確存儲,唯一的問題是當我嘗試查詢該字段時

問題是我在尋找錯誤的收藏品並將其投射到錯誤的類上

public class TaskService<T> : ITaskService<T> where T : ITask
    {
        private readonly IPersistanceLayer<ObjectId, object> _pl;


        public async Task<T> GetNextTask(string key)
        {
              var nextTask= _pl.Mongo.Filter<T>(x => x.ConcurrencyKey==key 
                , typeof(T).Name).OrderBy(x=> x.Timestamp).FirstOrDefault();
            return nextTask;
        }

    }

在此方法中,T的類型為BaseTask而不是MyTask,因此我的計算字段不存在,我已對此進行了更正,現在可以正常工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM