Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何映射实体数据库调用的额外属性_C#_Linq_Entity Framework - Fatal编程技术网

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);
    }
}