回到目錄
這個問題是這樣的,有一個實體dog,裡面有集合屬性DogHistory,它裡面有一些自己的屬性,其中一個是SortNum,主要用來進行排序,而且這個排序可以影響主對象,即影響dog類,這個在mongodb裡不容易實作,但也不是不能實作,我們需要分兩步考慮這個問題,不過首先我們需要知道,mongodb裡不支援子集合對象的子屬性排序,但它支援子實體對象的子屬性排序。
下面看一下資料結構
public class DogHistory
{
public bool IsHealth { get; set; }
public Adderss Adderss { get; set; }
public string HistoryName { get; set; }
public string[] Foods { get; set; }
public int SortNum { get; set; }
}
public class Dog : NoSqlEntity
{
public Des Des { get; set; }
public string Title { get; set; }
public string Type { get; set; }
public string[] Foods { get; set; }
public List<DogHistory> DogHistory { get; set; }
}
其中Dog類子實體屬性Des,它裡面有屬性sortNum,如果我們去排序,那是完全沒有問題的,代碼如下
Console.WriteLine("--------------------子實體對象");
var model3 = MongoDbClient.MongoManager<Dog>.Instance
.Find(Builders<Dog>.Filter.Eq("DogHistory.HistoryName", "毛仔"))
.SortBy(i => i.Des.SortNum).ToList();
model3.ToList().ForEach(i =>
{
Console.WriteLine(i.Title + ":" + i.Title + ",sort:" + i.Des.SortNum);
});
但如果希望根據DogHistory集合裡的某個屬性進行排序,那是不行的,雖然不行,但mongodb給出來了解決方案,對于集合類型可以通過索引下标的方式進行排序,這它是支援的。
下面代碼展現了如何實作這種複雜的排序:
var entityIndex = MongoDbClient.MongoManager<Dog>.Instance.Find(Builders<Dog>.Filter.Eq("DogHistory.HistoryName", "大毛")).FirstOrDefault();
var index = entityIndex.DogHistory.FindIndex(i => i.HistoryName == "大毛");
var model2 = MongoDbClient.MongoManager<Dog>.Instance
.Find(Builders<Dog>.Filter.Eq("DogHistory.HistoryName", "大毛"))
.SortBy(i => i.DogHistory[index].SortNum);
model2.ToList().ForEach(i =>
{
Console.WriteLine(i.Title + ":" + i.DataStatus);
});
結果與我們預期的一樣,當然,如果是簡單的字元數組類型,也是可以通過對資料下标元素排序的,呵呵。
測試結果:
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!