oData 过滤器无法在导航 属性 与 MongoDB 和 Web API 上工作
oData filter not working on navigation property with MongoDB and Web API
控制器看起来像
public class NodesRestController : ODataController
{
private INodeService _nodeService;
public NodesRestController(INodeService nodeService)
{
_nodeService = nodeService;
}
[EnableQuery()]
public IQueryable<Node> Get()
{
return _nodeService.GetAllNodes();
}
[EnableQuery()]
public Node Get(string id)
{
return _nodeService.GetNodeById(id);
}
}
在 MongoDb 存储库中,我正在返回集合的 AsQueryable。
//..............Rest of initializations
_collection = _dbContext.Database
.GetCollection<TEntity>(typeof(TEntity).Name);
//..........
public IQueryable<TEntity> GetAll()
{
return _collection.AsQueryable();
}
public TEntity Insert(TEntity entity)
{
entity.Id = ObjectId.GenerateNewId().ToString();
_collection.Insert(entity);
return entity;
}
//..............Rest of initializations
MongoDB 文档看起来像
{
"_id" : "5688d5b1d5ae371c60ffd8ef",
"Name" : "RTR1",
"IP" : "1.2.2.22",
"NodeGroup" : {
"_id" : "5688d5aad5ae371c60ffd8ee",
"Name" : "Group One",
"Username" : null,
"Password" : null
}}
ID 是使用 ObjectId.GenerateNewId().ToString() 生成的,因此它们存储为字符串。
Node 和 NodeGroup 是纯 POCO
public partial class NodeGroup : EntityBase
{
public string Name { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string LoginPrompt { get; set; }
public string PasswordPrompt { get; set; }
public string ReadyPrompt { get; set; }
public string Description { get; set; }
}
public partial class Node : EntityBase
{
public string Name { get; set; }
public string IP { get; set; }
public virtual NodeGroup NodeGroup { get; set; }
}
public abstract class EntityBase
{
//[JsonIgnore]
// [BsonRepresentation(BsonType.ObjectId)]
// [BsonId]
public string Id { get; set; }
}
问题
o数据 URI 类似于
http://localhost:9910/api/NodesRest
http://localhost:9910/api/NodesRest?$expand=NodeGroup
http://localhost:9910/api/NodesRest?$expand=NodeGroup&$filter=Name eq 'RTR1'
工作正常。
但是当我尝试过滤导航时 属性
http://localhost:9910/api/NodesRest?$expand=NodeGroup&$filter=NodeGroup/Name eq 'Group One'
它给了我例外
留言:"Unable to determine the serialization information for the expression: ConditionalExpression.",
我用了_collection.FindAll();它奏效了。
当我在不使用 mongoDB 的情况下使用内存收集时,它对我有用。还有。
mongodb 的 c# 驱动程序中的 AsQueryable 方法有问题。
控制器看起来像
public class NodesRestController : ODataController
{
private INodeService _nodeService;
public NodesRestController(INodeService nodeService)
{
_nodeService = nodeService;
}
[EnableQuery()]
public IQueryable<Node> Get()
{
return _nodeService.GetAllNodes();
}
[EnableQuery()]
public Node Get(string id)
{
return _nodeService.GetNodeById(id);
}
}
在 MongoDb 存储库中,我正在返回集合的 AsQueryable。
//..............Rest of initializations
_collection = _dbContext.Database
.GetCollection<TEntity>(typeof(TEntity).Name);
//..........
public IQueryable<TEntity> GetAll()
{
return _collection.AsQueryable();
}
public TEntity Insert(TEntity entity)
{
entity.Id = ObjectId.GenerateNewId().ToString();
_collection.Insert(entity);
return entity;
}
//..............Rest of initializations
MongoDB 文档看起来像
{
"_id" : "5688d5b1d5ae371c60ffd8ef",
"Name" : "RTR1",
"IP" : "1.2.2.22",
"NodeGroup" : {
"_id" : "5688d5aad5ae371c60ffd8ee",
"Name" : "Group One",
"Username" : null,
"Password" : null
}}
ID 是使用 ObjectId.GenerateNewId().ToString() 生成的,因此它们存储为字符串。
Node 和 NodeGroup 是纯 POCO
public partial class NodeGroup : EntityBase
{
public string Name { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string LoginPrompt { get; set; }
public string PasswordPrompt { get; set; }
public string ReadyPrompt { get; set; }
public string Description { get; set; }
}
public partial class Node : EntityBase
{
public string Name { get; set; }
public string IP { get; set; }
public virtual NodeGroup NodeGroup { get; set; }
}
public abstract class EntityBase
{
//[JsonIgnore]
// [BsonRepresentation(BsonType.ObjectId)]
// [BsonId]
public string Id { get; set; }
}
问题
o数据 URI 类似于
http://localhost:9910/api/NodesRest
http://localhost:9910/api/NodesRest?$expand=NodeGroup
http://localhost:9910/api/NodesRest?$expand=NodeGroup&$filter=Name eq 'RTR1'
工作正常。
但是当我尝试过滤导航时 属性
http://localhost:9910/api/NodesRest?$expand=NodeGroup&$filter=NodeGroup/Name eq 'Group One'
它给了我例外
留言:"Unable to determine the serialization information for the expression: ConditionalExpression.",
我用了_collection.FindAll();它奏效了。
当我在不使用 mongoDB 的情况下使用内存收集时,它对我有用。还有。
mongodb 的 c# 驱动程序中的 AsQueryable 方法有问题。