我正在使用标准 C# 驱动程序使用 Linq-MongoDB 查询集合:
from n in db.GetCollection<EntityWrapper<Customer>>("Customers").AsQueryable()
where n.Entity.Names.Contains(name)
select n.Entity;
然而,这会导致异常:
Class Customer does not have a member called names.
正如您在下面看到的,我正在包装我的实体以提供额外的元数据,而不会污染我的实体。
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);
}
}
我已经映射了私有字段:
BsonClassMap.RegisterClassMap<Customer>(n =>
{
n.AutoMap();
n.MapField("names");
});
我发现数据库中的数据是正确的。
当我删除私有字段并将Names
属性更改为 aList<string>
时,查询运行正常。显然,我不想走那条路,因为我会妥协封装。
大多数简单的查询都可以正常工作,例如
from n in db.GetCollection<EntityWrapper<Customer>>("Customers").AsQueryable()
where n.Entity.Priority > 3
select n.Entity;
更新
我想出了一个使查询工作的技巧:
public IEnumerable<string> Names
{
get
{
return names;
}
private set { } // The LINQ provider expects the property to have a setter
}
不过,这还不能让人接受。