C# 如何映射实体数据库调用的额外属性
我有以下课程:C# 如何映射实体数据库调用的额外属性,c#,linq,entity-framework,C#,Linq,Entity Framework,我有以下课程: public class MessageThread { /// <summary> /// Messages can relate to messages through replies /// </summary> public virtual List<Message> Messages { get; set; } [NotMapped] public int CountUnreadMes
public class MessageThread
{
/// <summary>
/// Messages can relate to messages through replies
/// </summary>
public virtual List<Message> Messages { get; set; }
[NotMapped]
public int CountUnreadMessages {get;set;}
}
我也想填写CountUnderMessages部分。。。我该怎么做呢。。。我想它看起来是这样的:
return this.PrepareAllMessageThreadsQuery( page, amount, sort, order, searchCriteria )
.Where(x => x.SentTo.Id == userID)
.Select(x => {
x.UnreadMessageCount = x.Messages.Where(a => a.Read == false).Count();
})
.Skip((page - 1) * amount)
.Take(amount);
显然,上述方法不起作用:)
我该怎么做呢
我意识到可能会有这样的选择(尽管我无法让它工作):
但我必须重新映射整个班级只是为了它
编辑……
我是这么想的:
public class MessageThread
{
/// <summary>
/// Messages can relate to messages through replies
/// </summary>
public virtual IList<Message> Messages { get; set; }
[NotMapped]
public int UnreadMessageCount
{
get
{
if( this.Messages == null )
{
return 0;
}
return this.Messages.Where(x => x.Read == false).Count();
}
}
}
公共类MessageThread
{
///
///消息可以通过回复与消息相关
///
公共虚拟IList消息{get;set;}
[未映射]
公共int未读消息计数
{
得到
{
if(this.Messages==null)
{
返回0;
}
返回this.Messages.Where(x=>x.Read==false).Count();
}
}
}
现在看起来可以了吗?您可以将
未读邮件计数
设置为仅获取属性。这仅在消息
与对象一起加载时有效
[NotMapped]
public int CountUnreadMessages
{
get
{
return Messages.Count(x => !x.Read);
}
}
在绑定到一个线程(可能是数千个)之前,它不会获取所有属于该线程的消息吗?或者虚拟消息属性不是这样工作的。。。我是否应该将其从列表转换为可枚举的,这样属性就不会进行db调用?如果您只想将其用于特定的查询,那么您只需执行
选择(x=>新建Mytype{CountUnderMessages=x.Messages.Count(x=>!x.Read)})
,如果这是您将一直使用的内容,而且Messages
属性将定期填充,然后在内存中运行。我不确定您的PrepareAllMessageThreadsQuery
如何工作,这取决于它是否需要访问数据库。嗯,我已将Messages属性更改为IEnumerable以延迟消息查询,这样我就不会浪费时间获取所有消息,然后在最后进行计数。。。听起来正确吗?PrepareAllMessageThreadsQuery返回一个IQueryable。我已添加到OP
public class MessageThread
{
/// <summary>
/// Messages can relate to messages through replies
/// </summary>
public virtual IList<Message> Messages { get; set; }
[NotMapped]
public int UnreadMessageCount
{
get
{
if( this.Messages == null )
{
return 0;
}
return this.Messages.Where(x => x.Read == false).Count();
}
}
}
[NotMapped]
public int CountUnreadMessages
{
get
{
return Messages.Count(x => !x.Read);
}
}