我有这个型号:
[Table("Book")]
public class Book
{
[Key]
public int BookID {get; set;}
[Column("Title")]
public string Title {get; set;}
// The IsReaded column must store a Boolean value relative to the current (authorized) user.
[NotMapped]
public bool IsReaded {get; set;}
}
有关我使用IdentityModel
,User.Identity.GetUserId ()
功能收到的用户授权内容的数据。
用户是否阅读过本书的数据在以下模型(表格)中:
[Table("Readers")]
public class Reader
{
[Key]
public int UserId {get; set;}
[ForeignKey("BookId")]
public int BookId {get; set;}
}
如果在此表中有关于用户和他阅读的书籍的数据,则表示他已阅读。
我找到了一种通过存储库执行此操作的方法,描述了我将另外为IsReaded字段分配值的GetBook方法。 (https://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application)
但在我的项目中,Book模型将经常使用,在不同的地方我使用方法:skip,take,where和others。 而且代码有点尴尬:
public Book GetBook(int booked){
var book = db.Books.SingeOrDefault(x=>x.BookId==booked);
book.IsReaded = db.Readers.Any(x=>x.BookId==booked && x.UserId == User.Identity.GetUserId());
return book;
}
public Book GetBooks(){
var books = db.Books.ToList();
var results = new List<Book>();
foreach(var item in books){
var book = new Book();
book.IsReaded = db.Readers.Any(x=>x.BookId== item.BookId && x.UserId == User.Identity.GetUserId());
results.add(book);
}
return results.add;
}
但是当我有这样一个方法时,这是一个问题:
var query = bookRepo.GetBooks().Where(x => x.Title != "NO").OrderByDescending(x => x.Title);
var part = new BookParts()
{
TotalItems = query.Count(),
Books = query.Skip(5).Take(10).ToList()
};
通过模型中的辅助上下文创建对数据库的查询看起来非常好。但它非常慢,不需要为每个模型创建额外的上下文。
[NotMapped]
public book IsReaded {
get {
var activeUserId = HttpContext.Current.User.Identity.GetUserId();
using (ContextDb db = new ContextDb())
{
if (activeUserId != null)
{
return db.Readers.Any(x=>x.UserId == activeUserId && x.BookId==BookId)
}
}
}
}
我不知道最好的,有用的建议?怎么做得更好?我搜索了互联网,发现没有什么对我有用。我希望能得到帮助!