是这样的,我们有一个场景,另一个服务器是写到MongoDB里面,我们的MVC页面要展示,需要分页展示
自己写了一个DAL
public class MongoConnect
{
public string ConnectString { get; set; }
}
public class MongoBaseDAL<TEntity>
{
public MongoBaseDAL(IOptions<MongoConnect> options)
{
ConnectString = options.Value.ConnectString;
}
private string ConnectString { get; set; } = "192.168.50.110:27017";
protected MongoClient Create()
{
var client = new MongoClient($"mongodb://{ConnectString}");
return client;
}
protected IMongoDatabase GetDatabase(string database)
{
var client = Create();
var db = client.GetDatabase(database);
return db;
}
protected IMongoCollection<TEntity> CreateQuery(string database,string tableName)
{
var db = GetDatabase(database);
return db.GetCollection<TEntity>(tableName);
}
protected PageDataView<TEntity> Page(string database, string tableName, Dictionary<string, BsonValue> dictionary, int pageSize, int currentPage)
{
var where = Builders<TEntity>.Filter.Empty;
if (dictionary.Count > )
{
var filterBuilder = Builders<TEntity>.Filter;
List<FilterDefinition<TEntity>> listFilter = new List<FilterDefinition<TEntity>>();
foreach (var pair in dictionary)
{
listFilter.Add(filterBuilder.Eq(pair.Key, pair.Value));
}
where = filterBuilder.And(listFilter);
}
PageDataView<TEntity> result = new PageDataView<TEntity>();
var query = CreateQuery(database, tableName);
result.TotalRecords = (int)query.CountDocuments(where);
result.TotalPages = result.TotalRecords / pageSize;
if (result.TotalRecords % pageSize > )
result.TotalPages += ;
var list = query.Find(where).Skip((currentPage - ) \* pageSize).Limit(pageSize).ToList();
result.Items = list;
return result;
}
}
比如有个类CreatedTableLog
那个Helper就是
public class CreatedTableLogHelper: MongoBaseDAL<CreatedTableLog>
{
public static string Database = "Base";
public static string Table = "CreatedTableLog";
public CreatedTableLogHelper(IOptions<MongoConnect> options) : base(options)
{
}
public PageDataView<CreatedTableLog> GetListByPage(Dictionary<string, BsonValue> dictionary, int pageSize, int currentPage)
{
return Page(Database, Table, dictionary, pageSize, currentPage);
}
}
在StartUp里面增加代码
#region MongoDB
services.Configure<MongoConnect>(Configuration.GetSection("MongoConnect"));
services.AddScoped(typeof(MongoBaseDAL<>));
services.AddScoped<CreatedTableLogHelper>();
#endregion
打开配置文件
appsettings.Development.json这个是DEBUG版本的配置文件
写入配置
"MongoConnect": {
"ConnectString": "192.168.50.110:27017"
}
192.168.50.110是我测试环境是MongoDB服务器地址,端口默认
appsettings.Development.json这个是Release版本的配置文件可能这个地址就是localhost了,要对应更改
比如CreatedTableLog表有三个字段
UserId和NickName需要查询
Dictionary<string, BsonValue> dictionary = new Dictionary<string, BsonValue>();
var index = model.Start == ? : (model.Start / model.Length) + ;
if (model.UserId != )
{
dictionary.Add("UserId", BsonInt64.Create(model.UserId));
}
if (!string.IsNullOrWhiteSpace(model.NickName))
{
dictionary.Add("NickName", BsonString.Create(model.NickName));
}
var result = CreatedTableLogHelper.GetListByPage(dictionary, model.Length, index);
这样你以为就ok了?no no no
会报错的,为什么同一个实体model,写入正常,读会报错_id错误呢?
因为实体model如果没有Id类型是ObjectId,会自动构建,但是你反序列化就会错误了
增加一个继承类
public class MongoDbBase
{
private ObjectId \_id;
public ObjectId Id
{
get { return \_id; }
set { \_id = value; }
}
}
你需要反序列化的实体对象继承
比如CreatedTableLog改为
public class CreatedTableLog: MongoDbBase
再读一下,对了吧?大功告成
手机扫一扫
移动阅读更方便
你可能感兴趣的文章