MongoDB的操作語法有別於實體資料庫,雖然支援LINQ,但新增/刪除/修改等方式仍然要以MongoDB
Driver 的語法為主,所以不熟悉MongoDB的朋友們超級的痛苦,所以自製簡易版的函式庫,供大家參考囉~
也歡迎大家多多交流。
public
class
MongoDBComponent
{
string
_connString;
MongoClient
_client;
IMongoDatabase
_server;
public
MongoDBComponent() {
try
{
_connString
= "mongodb://localhost:27017";
//未來要改為設定檔的方式,目前暫時以本機端的mongoDB為測試
_client
= new
MongoClient(_connString);
_server
= _client.GetDatabase("mydb");
}
catch
(Exception
ex)
{
throw
new
Exception(ex.Message);
}
}
} |
PS:注意事項
作者以本機端的MongoDB為測試機,記得要改_connString的設定值喔,另外要改為讀取設定值比較好維護
… 當然前提要安裝mongoDB
Driver for c#
一、新增
public
bool
Add<T>(string
tableName, T
value )
{
try
{
string
jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(value);
BsonDocument
document= BsonSerializer.Deserialize<BsonDocument>(jsonString);
var
collection = _server.GetCollection<BsonDocument>(tableName);
collection.InsertOne(document);
return
true;
}
catch
(Exception
ex)
{
throw
new
Exception(ex.Message);
}
} |
MongoDB是支援JSON格式,所有的物件經過JSON格式化後成為字串格式,才經由BsonDocument
轉成物件後,就可以傳入資料給MongoDB
二、修改
public
bool
Update<T>(string
tableName,string
searchKey, object
searchValue, T
value )
{
try
{
var collection = _server.GetCollection<BsonDocument>(tableName);
var filter = Builders<BsonDocument>.Filter.Eq(searchKey, searchValue);
var atts = value.GetType().GetProperties();
//取得所有元素
string
attributeName = "";
Type
typeObj;
PropertyInfo
properInfo;
object
attributeValue;
for
(int
i = 0; i < atts.Length - 1; i++)
{
attributeName
= atts[i].Name.ToString();
typeObj
= value.GetType();
properInfo
= typeObj.GetProperty(attributeName);
attributeValue
= properInfo.GetValue(value);
if
(attributeValue == null
|| attributeName== searchKey)
{
continue;
}
var
update = Builders<BsonDocument>.Update.Set(attributeName,
attributeValue);
var
result = collection.UpdateOne(filter, update);
}
return
true;
}
catch
(Exception
ex)
{
throw
new
Exception(ex.Message);
}
}
|
MongoDB更新的方式要呼.update.set(''欄位名稱'',更新值),
但如果有多筆欄位值更新時,就.update.set(''欄位名稱1'',更新值).set(''欄位名稱2'',更新值)
一直串的set
串接在一起,但是想改為共用的原件,就只好用笨方法,找到物件的所有屬性後,逐一跑迴圈執行Update.Set
每個欄位就執行一次Update
, 如果各位有更好的方法歡迎提供…
三、刪除
public
bool
Delete<T>(string
tableName, string
searchKey, object
searchValue)
{
try
{
var
collection = _server.GetCollection<T>(tableName);
var
filter = Builders<T>.Filter.Eq(searchKey,
searchValue);
var
result = collection.DeleteOne(filter);
return
true;
}
catch
(Exception
ex)
{
throw
new
Exception(ex.Message);
}
} |
刪除資料時,要先查詢出要刪除的那筆資料,所以呼叫Filter.Eq
找到那筆資料後,再呼叫DeleteOne
,如果說要刪除多筆時,MongoDB
有另外的函式呼叫多筆刪除喔,可別傻傻的一直呼叫DeleteOne,
這邊就不再做介紹,請有興趣的客倌去goole吧!
四、查詢資料
public
IEnumerable<T>
FindMany<T>(string
tableName,Expression<Func<T,bool>>whereConditions)
{
try
{
var
collection = _server.GetCollection<T>(tableName).AsQueryable<T>();
var
result= collection.Where(whereConditions).AsQueryable();
return
result;
}
catch
(Exception
ex)
{
throw
new
Exception(ex.Message);
}
}
|
查詢資料時為了可以自訂查詢條件,所以用
Expression<Func<T,bool>>whereConditions,允許傳入linq的lamda
查詢條件,更具彈性,並將MongoDB的查詢資料列直接轉成Ienumerable<T>
五、練習
MongoDBComponent
public
class
Member
:IEntityDB<Member>
{
[BsonId]
public
ObjectId
_id { get;
set;
}
public
string
Account { get;
set;
}
public
string
IdentityNumber { get;
set;
}
public
string
Password { get;
set;
}
public
string
Name { get;
set;
}
public
string
Mobile { get;
set;
}
public
string
Tel { get;
set;
}
public
string
Address { get;
set;
}
public
string
Email { get;
set;
}
public
DateTime
CreateDate { get;
set;
}
private
MongoDBComponent
_MongoDBEntity = new
MongoDBComponent();
public
bool
Add(Member
entityMember)
{
return
_MongoDBEntity.Add<Member>("Member",
entityMember);
}
public
bool
Delete(Member
entityMember)
{
return
_MongoDBEntity.Delete<Member>("Member",
"_id",
entityMember._id);
}
public
bool
Update(Member
entityMember)
{
return
_MongoDBEntity.Update<Member>("Member",
"_id",
entityMember._id, entityMember);
}
public
Member
FindOne(Member
entityMember)
{
return
_MongoDBEntity.FindMany<Member>("Member",
q => q._id == entityMember._id).FirstOrDefault();
}
public
IEnumerable<Member>
FindMany(Expression<Func<Member,
bool>>
whereConditions)
{
return
_MongoDBEntity.FindMany<Member>("Member",
whereConditions);
}
} |
這樣c#就能保持使用entity
Framework的習慣和彈性,具有基本新增/刪除/修改/查詢,如果有需要擴充其他方式,還請各位自已修改囉!
沒有留言:
張貼留言