我有一个使用MongoDB的.NET应用程序,所以我正在使用mongo c#驱动程序。我正在使用的当前版本是1.9.2。
我正在尝试将其更新为最新的C#mongodb驱动程序-2.7.0。到目前为止,为了打破更改,我不得不进行大量代码更改。此刻我有些困惑-可能会在其他时候向其他人提出新问题,但以下一个问题已导致该应用在调试时甚至无法加载。
这是我在1.9.2驱动程序中的原始代码:
/// <summary>
/// Since the current Mongo driver does not support database side Select
/// projections, we need to use this custom function to achieve the same.
/// </summary>
/// <param name="criteria"></param>
/// <param name="fields"></param>
/// <returns></returns>
public IEnumerable<T> Get(Expression<Func<T, bool>> criteria,
params Expression<Func<T, object>>[] fields)
{
return this.Collection.FindAs<T>(Query<T>.Where(criteria)).SetFields
(Fields<T>.Include(fields));
}
这是我尝试使用最新的C#驱动程序的方法:
/// <summary>
/// Since the current Mongo driver does not support database side Select
/// projections, we need to use this custom function to achieve the same.
/// </summary>
/// <param name="criteria"></param>
/// <param name="fields"></param>
/// <returns></returns>
public IEnumerable<T> Get(Expression<Func<T, bool>> criteria,
params Expression<Func<T, object>>[] fields)
{
return this.Collection.Find<T>(criteria).Project(Builders<T>.Projection.Include(FilterDefinitionBuilder<T>.(fields)));
}
但是我在。(fields))上出现红色的构建错误);说出不正确的主表达式,但不确定对此是否正确。
更新
我从下面的mickl答案中添加了代码,现在在运行应用程序时出现以下异常:
"An error occurred while deserializing the Id property of class MyApp.Domain.Models.EntityBase: Cannot deserialize a 'String' from BsonType 'ObjectId'."
我有一个BsonClassRegistration类,其中包含旧的C#驱动程序Mongo代码-其中的原始代码如下:
BsonClassMap.RegisterClassMap<EntityBase>(cm =>
{
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(x => x.Id).SetIdGenerator(StringObjectIdGenerator.Instance));
cm.GetMemberMap(c => c.Id).SetRepresentation(BsonType.ObjectId);
});
要通过升级到最新的C#驱动程序来解决此问题,我将代码更改为以下代码:
BsonClassMap.RegisterClassMap<EntityBase>(cm =>
{
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(x => x.Id).SetIdGenerator(StringObjectIdGenerator.Instance));
cm.GetMemberMap(c => c.Id).SetSerializer(new StringSerializer(BsonType.ObjectId));
});
这是否是我现在在Get方法中看到的失败原因?
答案 0 :(得分:1)
您可以像尝试使用Builders<T>.Projection
一样使用,但是必须动态构建ProjectionDefinition<T>
实例,具体操作如下:
public IEnumerable<T> Get(Expression<Func<T, bool>> criteria, params Expression<Func<T, object>>[] fields)
{
var find = Collection.Find<T>(criteria);
var builder = Builders<T>.Projection;
var definition = (ProjectionDefinition<T>)null;
foreach(var field in fields)
{
definition = definition?.Include(field) ?? builder.Include(field);
}
if (definition == null) return find.ToList();
return find.Project<T>(definition).ToList();
}