首页 > 解决方案 > 如何使用 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 的更改。有人有什么建议或帮助吗?谢谢。

标签: c#mysqlsqlentity-framework.net-5

解决方案


在更新所有内容以确保所有内容与当前版本的驱动程序同步后,它现在可以使用原始查询再次工作。我讨厌升级稳定的工作代码以使用更新版本的技术和 API。


推荐阅读