我有這樣的代碼,我想使用 Linq 查詢 MongoDB。
我從 MongoDB 集合中得到一個 AsQueryable。
public IEnumerable<IVideo> GetVideos()
{
var collection = database.GetCollection<IVideo>("Videos");
return collection.AsQueryable();
}
我是這樣稱呼的
var finalList = Filter2(Filter1(GetVideos())).Skip(2).Take(30);
foreach(var v in finalList)
{
....
}
帶有查詢的函式。
public IEnumerable<IVideo> Filter1(IEnumerable<IVideo> list)
{
return list.Where(q=>q.Categorized)
}
public IEnumerable<IVideo> Filter2(IEnumerable<IVideo> list)
{
var query = from d in list
where d.File == "string1" || d.File == "string2"
select d;
return query;
}
我的代碼作業正常。我的代碼托管在 IIS 中,大約有 50,000 條記錄,查詢比示例有點復雜。我的作業行程峰值達到 17%,并且在呼叫 foreach 時需要幾秒鐘才能執行。對于如此低的日期數量來說,這是一個荒謬的高。
我有一些問題。
- 查詢是由 .net 還是 MongoDB 執行?如果它是由 MongoDB 執行的,為什么我的作業行程會受到如此大的打擊?
- 我可以采取哪些步驟來縮短呈現查詢的執行時間并減少服務器負載。
謝謝
uj5u.com熱心網友回復:
您意外地在客戶端下載了所有條目
public IEnumerable<IVideo> Filter1(IEnumerable<IVideo> list)
{
var list = list.Where(q=>q.Categorized)
}
IEnumerable導致可查詢執行并回傳結果。將過濾器方法更改為 accept 和 return IQueryable。
編輯:
您發布的代碼:
public IEnumerable<IVideo> Filter1(IEnumerable<IVideo> list)
{
var list = list.Where(q=>q.Categorized)
}
不編譯。
您的代碼應如下所示:
public IQueryable<IVideo> Filter1(IQueryable<IVideo> qVideos)
{
return qVideos.Where(q => q.Categorized);
}
public IQueryable<IVideo> Filter2(IQueryable<IVideo> qVideos)
{
return qVideos
.Where(e => e.File == "string1" || e.File == "string2");
}
public DoSomething()
{
// This is the query, in debug mode you can inspect the actual query generated under a property called 'DebugView'
var qVideos = Filter2(Filter1(GetVideos()))
.Skip(1)
.Take(30);
// This runs the actual query and loads the results client side.
var videos = qVideos.ToList();
// now iterated
foreach (var video in videos)
{
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/391907.html
