using MongoDB.Driver;
2 using System;
3 using System.Collections.Generic;
4 using System.Text;
5
6 using System.Linq;
7 using System.Linq.Expressions;
8 using System.Reflection;
9 using MongoDB.Driver.Linq;
10
11 namespace Common
12 {
13
14
15 public class MongodbHelper
16 {
17 protected static MongoClient client;
18
19 public MongodbHelper()
20 {
21 client =
new MongoClient(
"mongodb://localhost:27017");
22 }
23 static MongodbHelper()
24 {
25 client =
new MongoClient(
"mongodb://localhost:27017");
26 }
27 /// <summary>
28 /// 获取 Collection 信息
29 /// </summary>
30 /// <typeparam name="T">实体类型</typeparam>
31 /// <param name="collName">Collection 名称</param>
32 /// <param name="dbName">DBase名称</param>
33 /// <returns></returns>
34 public static MyCollection<T> GetCollection<T>(
string collName,
string dbName)
35 {
36 MyCollection<T> mycollection =
new MyCollection<T>
();
37 IMongoDatabase database =
client.GetDatabase(dbName);
38 IMongoCollection<T> collection = database.GetCollection<T>
(collName);
39 mycollection.collection =
collection;
40 return mycollection;
41 }
42 }
43
44 public class MyCollection<T>
45 {
46 public IMongoCollection<T>
collection;
47
48 /// <summary>
49 /// 查询数据 延迟加载 后期可以使用Linq Lambda处理数据
50 /// </summary>
51 /// <returns></returns>
52 public IMongoQueryable<T>
QueryData()
53 {
54 var list = collection.AsQueryable<T>
();
55 return list;
56 }
57 /// <summary>
58 /// 查询所有数据
59 /// </summary>
60 /// <param name="expression"></param>
61 /// <returns></returns>
62 public List<T> QueryData(Expression<Func<T,
bool>>
expression)
63 {
64 var list =
collection.AsQueryable().Where(expression);
65 return list.ToList<T>
();
66 }
67
68 /// <summary>
69 /// 分页查询
70 /// </summary>
71 /// <param name="expressio"></param>
72 /// <param name="pageInfo"></param>
73 /// <returns></returns>
74 public PageInfo<T> QueryData(Expression<Func<T,
bool>> expressio, PageInfo<T>
pageInfo)
75 {
76 List<T> list =
null;
77 pageInfo.Totoal = collection.AsQueryable<T>
().Count();
78 pageInfo.PageNum = (
int)Math.Ceiling(pageInfo.Totoal / pageInfo.PageSize *
0.1);
79 if (pageInfo ==
null || pageInfo.IsAll ==
true)
80 if (expressio !=
null)
81 list = collection.AsQueryable<T>
().Where(expressio).ToList();
82 else list = collection.AsQueryable<T>
().ToList();
83 else if (expressio !=
null)
84 {
85 list = collection.AsQueryable<T>().Where(expressio).Skip(pageInfo.PageSize * (pageInfo.PageIndex -
1)).Take(pageInfo.PageSize).ToList();
86 }
87 else
88 {
89 list = collection.AsQueryable<T>().Skip(pageInfo.PageSize * (pageInfo.PageIndex -
1)).Take(pageInfo.PageSize).ToList();
90 }
91 pageInfo.Data =
list;
92 return pageInfo;
93 }
94
95 /// <summary>
96 /// 新增一条数据(文档)
97 /// </summary>
98 /// <param name="ts"></param>
99 public void AddDoc(T ts)
100 {
101 collection.InsertOne(ts);
102 }
103 /// <summary>
104 /// 批量新增多个文档
105 /// </summary>
106 /// <param name="ts"></param>
107 public void AddDocs(List<T>
ts)
108 {
109 collection.InsertMany(ts);
110 }
111 /// <summary>
112 /// 更新文档 不存在就新增
113 /// </summary>
114 /// <param name="filter"></param>
115 /// <param name="t"></param>
116 public void UpdateDoc(Expression<Func<T,
bool>>
filter, T t)
117 {
118 // FilterDefinition<T> filter = null;
119 // UpdateDefinition<T> update = Builders<T>.Update.ToBsonDocument();// null;// Builders<T>.Update.
120 var newData =
BuildQueryOption(t);
121 UpdateResult result = collection.UpdateOne(filter, newData,
new UpdateOptions { IsUpsert =
true });
122 }
123 /// <summary>
124 /// 删除文档
125 /// </summary>
126 /// <param name="predicate"></param>
127 public void Detele(Expression<Func<T,
bool>>
predicate)
128 {
129 var result = collection.DeleteMany(predicate);
//.ConfigureAwait(false);
130 // return result.DeletedCount;
131 }
132 /// <summary>
133 /// 利用反射创建 更新字段 (这里没有处理空)
134 /// </summary>
135 /// <param name="doc"></param>
136 /// <returns></returns>
137 private UpdateDefinition<T>
BuildQueryOption(T doc)
138 {
139 var update = Builders<T>
.Update;
140 var updates =
new List<UpdateDefinition<T>>
();
141
142 var t =
doc.GetType();
143 var proper =
t.GetProperties();
144 foreach (PropertyInfo info
in proper)
145 {
146 var value =
info.GetValue(doc);
147 if (value !=
null)
148 {
149 updates.Add(update.Set(info.Name, info.GetValue(doc)));
150 }
151
152 }
153 // update.Combine(updates);
154 return update.Combine(updates);
155 }
156 }
157 /// <summary>
158 /// 分页信息
159 /// </summary>
160 /// <typeparam name="T"></typeparam>
161 public class PageInfo<T>
162 {
163 public bool IsAll {
get;
set; } =
false;
164 public int PageSize {
get;
set; } =
100;
165 public int PageIndex {
get;
set; } =
1;
166 public long Totoal {
get;
set; }
167
168 public int PageNum {
get;
set; }
169
170 public List<T> Data {
get;
set; }
171 }
172 }
View Code
3. 测试方法
using Common;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;
namespace ZhiHuHot
{
public class TestMongo
{
public void GetHot()
{
MyCollection<HotInfo> collection = MongodbHelper.GetCollection<HotInfo>("ZhiHuHot", "ZhiHu");
Expression<Func<HotInfo, bool>> predicate = null;
predicate = a => a.HotID.Equals(391481443);
PageInfo<HotInfo> hots = collection.QueryData(null, new PageInfo<HotInfo>());
}
}
}
View Code
C# Mongodb 封装类
标签:red gen div build math static text ted color