C# Linq中具有多个表和左外部联接的复杂联接

C# Linq中具有多个表和左外部联接的复杂联接,c#,sql-server,linq,entity-framework-core,C#,Sql Server,Linq,Entity Framework Core,希望有人能为我指明正确的方向。我正在尝试将一些SQL转换为Linq。我的SQL在几个内部联接之后有一个左外部联接。以下SQL生成所需的结果: SELECT TOP(50) [t].[TagFriendlyName] AS [TagName], [t0].[timeStamp] AS [LastSeen], [l].[Name] AS [LocationName] FROM [Tags] AS [t] INNER JOIN [tag_reads] AS [t0] ON [t].[epc] = [t

希望有人能为我指明正确的方向。我正在尝试将一些SQL转换为Linq。我的SQL在几个内部联接之后有一个左外部联接。以下SQL生成所需的结果:

SELECT TOP(50) [t].[TagFriendlyName] AS [TagName], [t0].[timeStamp] AS [LastSeen], [l].[Name] AS [LocationName]
FROM [Tags] AS [t]
INNER JOIN [tag_reads] AS [t0] ON [t].[epc] = [t0].[epc]
INNER JOIN [ReaderData] AS [r] ON [t0].[ReaderDataId] = [r].[Id]
LEFT OUTER JOIN [Readers] AS [r0] ON [r].[mac_address] = [r0].[mac_address]
INNER JOIN [Locations] AS [l] on [t0].[antennaPort] = [l].[AntennaId] AND [r].[Id] = [l].[ReaderId]
GROUP BY [t].[TagFriendlyName], [t0].[timeStamp], [l].[Name]
ORDER BY [t0].[timeStamp] DESC 
我的Linq代码如下所示,但我不知道如何正确插入左侧外部联接。不确定如何引入需要左外部联接的Readers表:

var query = (
from tags in db.Tags
join tagreads in db.tag_reads on tags.epc equals tagreads.epc
join readerdata in db.ReaderData on tagreads.ReaderDataId equals readerdata.Id
join readers in db.Readers on readerdata.mac_address equals readers.mac_address

group tags by new { tags.TagFriendlyName, timestamp = tagreads.timeStamp, readerdata.mac_address } into grp

select new CurrentStatus()
{
TagName = grp.Key.TagFriendlyName,
LastSeen = grp.Key.timestamp,
LocationName = grp.Key.mac_address
}
)
.OrderByDescending(o => o.LastSeen)
根据需要,我需要使用
DefaultIfEmpty()
,但我不确定在哪里引入Readers表


使用EF Core 3.1.0。谢谢

您应该通过以下方式应用
左连接

join readers in db.Readers on readerdata.mac_address equals readers.mac_address into readersJ
from readers in readersJ.DefaultIfEmpty()
完整代码:

var query = (
    from tags in db.Tags
    join tagreads in db.tag_reads on tags.epc equals tagreads.epc
    join readerdata in db.ReaderData on tagreads.ReaderDataId equals readerdata.Id
    join readers in db.Readers on readerdata.mac_address equals readers.mac_address into readersJ
    from readers in readersJ.DefaultIfEmpty()
    join locations in db.Locations 
        on new { ap = tagreads.antennaPort, rd = readerdata.Id }
        equals new { ap = locations.AntennaId, rd = locations.ReaderId }
    group tags by new { tags.TagFriendlyName, timestamp = tagreads.timeStamp, readerdata.mac_address } into grp

    select new CurrentStatus()
    {
        TagName = grp.Key.TagFriendlyName,
        LastSeen = grp.Key.timestamp,
        LocationName = grp.Key.mac_address
    }
)
.OrderByDescending(o => o.LastSeen)

谢谢,这很有帮助。如何处理表“位置”的连接:在左外部连接之后,我有另一个内部连接:内部连接[Locations]作为[t0].[antennaPort]=[l].[AntennaId]和[r].[Id]=[l].[ReaderId]我需要的值之一来自位置表。@eltonLaunders但我想知道为什么需要这个
LeftJoin
?你根本没用过它,它可以被消除!谢谢,是的,我的Linq尝试缺少使用位置表中字段的部分,但是我非常确定需要
左连接来获得正确的值。你让我走了!我有一个Id列类型不匹配的问题,但这超出了我的问题范围,IDE明确了问题所在。谢谢