0

假设我有一个表Mail和一个表Mail.Read,其中存储了邮件和已阅读邮件的用户之间的关系。

现在我的邮件实体有一个未绑定的属性DateTime? dateRead,有没有可能以某种方式加入这个属性,保留一个IQueryable<Mail>

from m in dbContext.Mails
from mr in dbContext.MailsRead.Where(mr => mr.MailId = m.Id && mr.UserId == UserId).DefaultIfEmpty()
select new { Mail = m, Seen = (DateTime?)mr.DateCreated }

有效,但给了我一个新类型,所以结果不能在IQueryable<Mail>. 我想以某种方式设置未绑定的属性以保持纯可查询。

例如

(from m in dbContext.Mails
from mr in dbContext.MailsRead.Where(mr => mr.MailId = m.Id && mr.UserId == UserId).DefaultIfEmpty()
select new { Mail = m, Seen = (DateTime?)mr.DateCreated })
.Select(m => { m.DateSeen = m.Seen; return m.Mail; });

在仍然是 IQueryable 时设置属性。由于 EFCore 无法使用此查询,.Where()因此在此解决方案之后不再可以使用过滤器(例如 )。

4

1 回答 1

0

如果实体使用适当的关系并且MailRead实体显示为例如以下List<MailRead> MailsRead中的属性Mail

class Mail
{
    public long Id {get;set;}
    ...
    public List<MailRead> MailsRead {get;set;}
    ...
}

你可以只写:

var mails=dbContext.Mails.Inculde(m=>m.MailsRead
                                      .Where(mr=>mr.UserID == UserID);

过滤包含首先在 EF Core 5 中引入。

如果实体没有关系,它们应该。EF Core 是一个 ORM。DbContext 不是数据库模型,实体不是表,LINQ 也不是 SQL 的替代品。顾名思义,EF Core 将对象映射到关系类型。它旨在允许应用程序使用对象并将任何操作映射到 SQL。

于 2021-09-30T11:08:56.260 回答