C# Linq 2 Sql AssociateWith方法的替代方案

C# Linq 2 Sql AssociateWith方法的替代方案,c#,linq-to-sql,entity-framework-core,C#,Linq To Sql,Entity Framework Core,我正在将ASP.NET MVC应用程序重写为ASP.NET CORE,并遇到了一个使用Linq 2 Sql AssociateWith方法的案例,我不确定如何正确重写它。在.NETCore中,我现在使用的是实体框架 Linq 2 Sql代码: var option = new System.Data.Linq.DataLoadOptions(); option.LoadWith<Device>(e => e.SensorStatus); option.LoadWith<D

我正在将ASP.NET MVC应用程序重写为ASP.NET CORE,并遇到了一个使用Linq 2 Sql AssociateWith方法的案例,我不确定如何正确重写它。在.NETCore中,我现在使用的是实体框架

Linq 2 Sql代码:

var option = new System.Data.Linq.DataLoadOptions();
option.LoadWith<Device>(e => e.SensorStatus);
option.LoadWith<Device>(e => e.SensorVisibilities);
option.AssociateWith<Device>(e => e.SensorStatus.OrderByDescending(c => c.SensorDataID).Take(1));
option.LoadWith<SensorStatus>(e => e.SensorDatas);
ctx.LoadOptions = option;

另外,我搜索了Stack上的帖子,但只找到了一个类似的主题,其中只有一个join。()

在实体框架中,当您使用
.Include()

查询中对
.OrderByDescending().Take()
的调用影响的是
设备的加载方式,而不是
SensorStatus.SensorData

您有两个选择:

  • 加载您正在执行的所有操作,但不要调用
    OrderByDescending()。Take()
    ,因为这不是您想要的:

    var devices = ctx.Device
        .Include(x => x.SensorStatus)
            .ThenInclude(x => x.SensorData)
        .Include(x => x.SensorVisibility);
    
  • 加载到
    传感器状态
    ,然后选择要加载的内容:

    var devices = ctx.Device
        .Include(x => x.SensorStatus)
        .Include(x => x.SensorVisibility);
    
    foreach (var device in devices)
    {
        device.SensorStatus.SensorData = ctx.SensorStatus
            .Where(x => x.SensorStatusId == device.SensorStatusId) // I'm assuming the name of the key here
            .OrderByDescending(x => x.SensorDataId)
            .FirstOrDefault();
    }
    

  • 使用*LINQ to Entities的实体框架:这就是你的意思吗?(LINQ to SQL来自旧的、EF之前的,>NET LINQ ORM。)@Richard不,它实际上是LINQ to SQL:Second read:我明白你的意思。也许“将LINQ重写为SQL在EF Core中的关联”会更清楚。
    var devices = ctx.Device
        .Include(x => x.SensorStatus)
        .Include(x => x.SensorVisibility);
    
    foreach (var device in devices)
    {
        device.SensorStatus.SensorData = ctx.SensorStatus
            .Where(x => x.SensorStatusId == device.SensorStatusId) // I'm assuming the name of the key here
            .OrderByDescending(x => x.SensorDataId)
            .FirstOrDefault();
    }