Альтернатива для метода Linq 2 Sql AssociateWith - PullRequest
0 голосов
/ 01 июля 2018

Я переписываю приложение ASP.NET MVC в ASP.NET CORE и столкнулся с делом, использующим метод Linq 2 Sql AssociateWith, для которого я не уверен, как правильно переписать его. В .NET Core я сейчас использую Entity Framework.

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;

Текущий код EF, для которого я не уверен, правильно ли я понял:

var devices = ctx.Device.Include(x => x.SensorStatus)
                        .ThenInclude(x => x.SensorData).OrderByDescending(x => x.SensorStatus.Select(y => y.SensorDataId)).Take(1)
                        .Include(x => x.SensorVisibility);

пс. Я искал сообщения в стеке, но нашел только одну похожую тему, где было только одно присоединение. ( Entity Framework против AssociateWith )

1 Ответ

0 голосов
/ 01 июля 2018

В Entity Framework нет опции фильтровать то, что вы загружаете, когда используете .Include().
Вызовы .OrderByDescending().Take() в вашем запросе влияют на загрузку Device s, а не SensorStatus.SensorData.

У вас есть два варианта:

  1. Загрузите все, как вы делаете, но оставьте в стороне звонки на OrderByDescending().Take(), поскольку это не то, что вы хотите:

    var devices = ctx.Device
        .Include(x => x.SensorStatus)
            .ThenInclude(x => x.SensorData)
        .Include(x => x.SensorVisibility);
    
  2. Загрузите до SensorStatus и выберите, что загружать потом:

    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();
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...