访问从Linq-to-MongoDB查询通过私有字段映射的嵌套属性

San*_*zen 5 c# linq mongodb

我使用标准C#驱动程序使用Linq-MongoDB查询集合:

from n in db.GetCollection<EntityWrapper<Customer>>("Customers").AsQueryable()
where n.Entity.Names.Contains(name)
select n.Entity;
Run Code Online (Sandbox Code Playgroud)

但这导致异常:

Class Customer does not have a member called names.
Run Code Online (Sandbox Code Playgroud)

正如您在下面看到的,我正在包装我的实体以提供额外的元数据而不会污染我的实体.

public class EntityWrapper<TEntity>
{
    public TEntity Entity { get; set; }
    public string CreatedBy { get; set; }
}

public class Customer : Entity
{
     private List<string> names = new List<string>();
     public IEnumerable<string> Names { get { return names; } }

     public void AddName(string name)
     {
         names.Add(name);
     }
}
Run Code Online (Sandbox Code Playgroud)

我已经映射了私有字段:

BsonClassMap.RegisterClassMap<Customer>(n =>
{
    n.AutoMap();
    n.MapField("names");
});
Run Code Online (Sandbox Code Playgroud)

我发现数据库中的数据是正确的.

当我删除私有字段并将Names属性更改为a时List<string>,查询运行正常.显然,我不想走那条路,因为我会妥协封装.

大多数简单的查询工作得很好,例如

from n in db.GetCollection<EntityWrapper<Customer>>("Customers").AsQueryable()
where n.Entity.Priority > 3
select n.Entity;
Run Code Online (Sandbox Code Playgroud)

UPDATE

我找到了一个让查询工作的黑客:

public IEnumerable<string> Names
{
    get
    {
        return names;
    }
    private set { } // The LINQ provider expects the property to have a setter
}
Run Code Online (Sandbox Code Playgroud)

尽管如此,这还是不可接受的.