我通常使用通用資源庫對我的EF查詢進行樣板化,因此我必須編寫有限的代碼並使用緩存。存儲庫的源代碼可以在here找到。組合包含實體框架
代碼中的骨幹查詢是下面這個。 FromCache<T>()
是一個IEnumerable<T>
擴展方法,它利用HttpContext.Cache
以lambda表達式的字符串化表示形式作爲關鍵字來存儲查詢。
public IQueryable<T> Any<T>(Expression<Func<T, bool>> expression = null)
where T : class, new()
{
// Check for a filtering expression and pull all if not.
if (expression == null)
{
return this.context.Set<T>()
.AsNoTracking()
.FromCache<T>(null)
.AsQueryable();
}
return this.context.Set<T>()
.AsNoTracking<T>()
.Where<T>(expression)
.FromCache<T>(expression)
.AsQueryable<T>();
}
雖然這一切工作是受N + 1問題的相關表,因爲如果我是寫像這樣的查詢:
var posts = this.ReadOnlySession.Any<Post>(p => p.IsDeleted == false)
.Include(p => p.Author);
的Include()
會對我的查詢無影響因爲它已經被運行以便被緩存。
現在我知道我可以強制實體框架使用我的模型中的加載加載,通過刪除我的導航屬性上的虛擬前綴,但對我來說,感覺就像錯誤的地方去做,因爲你無法預測你的查詢類型將會製作。對我來說,感覺就像我會在控制器課上做的一樣。我想知道的是,我是否可以將我的Any<T>()
方法中的包含列表傳遞給我,然後我可以在我撥打電話時進行迭代?
太棒了!這看起來就像我正在尋找的那樣。謝謝! – 2013-02-18 12:32:08
順便說一句我用類似的投影;-) – 2013-02-18 12:36:00
你可能擴大你的答案更接近我目前使用的方法?我迷失了一些翻譯。也可以通過一系列包含作爲參數嗎? – 2013-02-18 13:07:55