c# - 如何使用 Entity Framework 和 .NET 5.0 构建查询以在相关表中查找不匹配的实体?
问题描述
我正在使用 .NET (Core?) 5.0 和 Entity Framework 以及使用 Pomelo 驱动程序的 MySQL 8.0 数据库。在以前版本的 .NET Core 3.1 和 MySQL 5.7 中,我能够创建一个查询或 lambda 表达式来查找一个表中的所有记录,这些记录在给定用户的另一个相关表中没有对应的记录。这是以前工作的方法:
public int GetUnacknowledgedAlarmEventsCount(string name, ApplicationUser user)
{
int count = 0;
if (name != null && user != null)
{
count = (from ae in AlarmEvents
where ae.Alarm.Name.StartsWith(name) && !ae.Acks.Any(a => a.UserId == user.Id)
select ae).Count();
}
return count;
}
此查询背后的表结构简化为:
Alarms
------
Id
Name
AlarmEvents
-----------
Id
AlarmId
AlarmEventAcks
--------------
Id
AlarmEventId
UserId
Users
-----
Id
我希望这些关系基于名称是显而易见的。无论如何,我正在尝试确定给定用户尚未确认哪些警报事件。我知道我可以在多个步骤中执行此操作,但会对性能造成巨大影响,但我希望将所有工作都放在数据库查询上,就像在以前的版本中一样。不知道为什么它不像以前那样工作,除了延迟加载不像以前的版本默认那样启动。
我尝试更改此查询以使用带有如下包含的 Lambda 表达式,但这也不起作用:
public int GetUnacknowledgedAlarmEventsCount(string station, ApplicationUser user)
{
int count = 0;
if (station != null && user != null)
{
count = AlarmEvents.Include(a => a.Alarm).Include(a => a.Acks).Where(a => a.Alarm.Name.StartsWith(station)).Where(a => !a.Acks.Any(a => a.UserId == user.Id)).Count();
}
return count;
}
因此,我一直在努力找出构建此查询的最佳方法,以处理对 .NET 最新版本的 Entity Framework 的更改。有人有什么建议或帮助吗?谢谢。
解决方案
在更新所有内容以确保所有内容与当前版本的驱动程序同步后,它现在可以使用原始查询再次工作。我讨厌升级稳定的工作代码以使用更新版本的技术和 API。
推荐阅读
- javascript - 让 div 上下滚动
- python - 将列表参数传递给 zeep 方法
- java - 用户如何通过点击 google maps android 添加标记?
- python - 如何在鼠标所在的地方转动精灵
- elasticsearch - 弹性搜索中的“标准”类型
- c# - 我不知道如何从 'float' 转换为 'int'
- android - 如何修复 android studio 中的 getWritableDatabase() 错误?
- php - Mysql IN(1,2,3) 运算符正在获取与 1 匹配的数据
- php - 用php重复合并或组合一个数组中的N(6)行文本
- objective-c - 如何修复“架构 x86_64 的未定义符号”委托