entity-framework-core - EFCore 附加“计算属性”的最佳方式
问题描述
假设我有一个表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()
因此在此解决方案之后不再可以使用过滤器(例如 )。
解决方案
如果实体使用适当的关系并且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。
推荐阅读
- winapi - Windows 10 API 例程的汇编程序调用约定
- python - 如何从 Pandas DF 创建(正确)一个 NumPy 数组
- sql - 根据条件删除/修改一个表中的行 - Oracle DBMS
- go - 为什么我的 Google Cloud Run 服务器返回 CORS 错误?
- c# - 遍历大型 2 列列表的最佳方法
- lisp - 在 Lisp 中将 hashtable 中的每个值重置为 nil
- python - 熊猫爆炸错误 - 列必须是标量
- c# - C# Lambda / 扩展方法使 4 个实体之间的结果变平?
- javascript - 在 React 中使用条件导入
- sitecore - 如何使用 XML 和 ShowModalDialog 创建站点核心对话框