我開始使用Entity Framework 6並學習Domain Driven Design。LINQ to Entities無法識別該方法 - 實體框架和DDD
據我瞭解,根據DDD原則,業務邏輯應該駐留在領域層,在實體和值對象。
在我ApplicationUser
類,我想有說該用戶是否爲當前在聊天活躍的方法:
public bool IsActiveInChat()
{
return this.ConnectedToChat &&
(DateTime.Now - this.LastChatActivity).TotalMinutes < 10;
}
方法的目的是來過濾顯示哪些用戶聊天成員列表。
這是ApplicationUserManager
查詢,這是Repository
:
public List<ApplicationUser> GetUsersConnectedToChat()
{
List<ApplicationUser> users = Users
.Where(u => u.IsActiveInChat())
.ToList();
return users;
}
當我運行這段代碼,我得到的錯誤:
LINQ to Entities does not recognize the method 'Boolean IsActiveInChat()' method, and this method cannot be translated into a store expression.
我可以很容易地通過轉移,使這項工作邏輯到Repository
,但從我所瞭解的DDD中,業務邏輯應該屬於實體而不是存儲庫中。
這是(在ApplicationUser
沒有方法)相同的查詢的工作版本:
public List<ApplicationUser> GetUsersConnectedToChat()
{
List<ApplicationUser> users = Users
.Where(u => u.ConnectedToChat &&
DbFunctions.DiffSeconds(DateTime.Now, u.LastChatActivity) < 10)
.ToList();
return users;
}
所以,我的問題是:這是一個已知的問題與實體框架?
我誤解的東西嗎?
是否有辦法繞過這個問題,並保持User
實體內部的商業邏輯?
P.S. - 由marc_s提出的問題不回答我的問題。首先,在那裏給出的答案建議使用AsEnumerable
,它將整個表提取到內存中,並且性能不佳。它也沒有回答我對這個問題的領域驅動設計方法是什麼的問題,這個問題看起來很常見,而且在我的項目中我會遇到很多問題。
[方法不能被翻譯成店表情]可能的複製(http://stackoverflow.com/questions/3846716/method-cannot-be-translated -into-store-expression) –
我編輯了我的問題來解釋爲什麼這不是重複的。 – Royar
這是因爲它回答你的第一個問題。其他問題太廣泛了,因爲他們首先需要討論EF類模型是領域模型的錯誤假設。這是一個DAL。 –