C# 数据库表的动态列,值为IdentityModel
我有这个模型:C# 数据库表的动态列,值为IdentityModel,c#,asp.net,asp.net-mvc,entity-framework,entity-framework-6,C#,Asp.net,Asp.net Mvc,Entity Framework,Entity Framework 6,我有这个模型: [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. [N
[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()
函数收到的用户授权的数据
关于用户是否阅读过本书的数据如下表所示:
如果在这个表中有关于用户和他读的书的数据,这意味着他读了它
我找到了一种通过存储库实现这一点的方法,描述了GetBook方法,在该方法中,我将另外为IsReaded字段分配一个值。()
但在我的项目中,图书模型将被经常使用,在不同的地方我使用的方法是:跳过、取、何处和其他。
代码有点笨拙:
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;
}
通过模型中的辅助上下文创建对数据库的查询看起来非常好。但是它非常慢,并且不需要为每个模型创建额外的上下文
[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)
}
}
}
}
我不知道最好的,有用的建议是什么?如何做得更好?我在网上搜索,没有发现对我有用的东西。我希望能得到帮助 我在代码中没有看到任何提示动态列的内容。我所看到的是大量的数据库i/O,可以通过正确建模关系或将查询与正确使用联接相结合来压缩。@Igor基于标题很难理解需要什么,我无法在标题中更准确地描述它。阅读我的问题,你就会明白我需要什么:)@Igor更准确地说,我希望用户获得一个图书模型,该模型上也有一个关于阅读图书的标志。这与“喜欢”系统在社交网络中的实现非常相似,当你在照片或消息上打上“喜欢”标记后,“喜欢”将被标记。我明白了,你可以通过建立关系来实现这一点,特别是在
书籍
和阅读器
实体之间建立导航关系。通过这样做,您可以在一个查询中检索所需的所有内容,而不是每本书一个查询。。另见
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)
}
}
}
}