EF core объединение с использованием include - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь объединить связанные данные, используя Include, но у меня возникли некоторые трудности. Мои модели следующие

public partial class GBTObject
{
    public uint Id { get; set; }
    public uint OrganizationId { get; set; }
    public string Name { get; set; }
    public virtual Device Device { get; set; }
    public uint? DeviceId { get; set; }
}

public partial class Device
{
    public uint Id { get; set; }
    public uint OrganizationId { get; set; }
    public string UUID { get; set; }
    public bool? Enabled { get; set; }
}

public partial class DeviceState
{
    public uint Id { get; set; }
    public uint OrganizationId { get; set; }

    public uint DeviceId { get; set; }
    public string State { get; set; }
    public DateTime? Timestamp { get; set; }
    public byte? Event { get; set; }
    public ulong TotalDistance { get; set; }
    public string UserAgent { get; set; }
}

var data = _context.GBTObject
    .Where(x => x.DeviceId != null && x.OrganizationId == _user.OrganizationId)
    .Include(x => x.Device)
    .Include(x => x.State)

Затем я попытался создать свойство тени внутри Device

[ForeignKey("Id")] public virtual DeviceState State{ get; set; }

var data = _context.GBTObject
    .Where(x => x.DeviceId != null && x.OrganizationId == _user.OrganizationId)
    .Include(x => x.Device)
    .ThenInclude(x => x.State)   

Но это не работает, потому что он присоединяется, используя DeviceId из GBTObject с Id из DeviceState. Изменение внешнего ключа на DeviceId приводит к странным ошибкам именования (он именует GBTObject.DeviceId в GBTObject.DeviceId1, а затем жалуется, что его не существует и выглядит как ошибка).

Я делаю это неправильно?

1 Ответ

0 голосов
/ 11 мая 2018

Попробуйте следующее:

var data = from gbt in _context.GBTObject
               join ds in _context.DeviceState
               on gbt.DeviceId equals ds.DeviceId
               where gbt.DeviceId != null && gbt.OrganizationId == _user.OrganizationId
               select gbt;

Также проверьте эту ссылку для получения дополнительной информации о присоединении к LINQ:

Каков синтаксис внутреннего соединения в LINQ to SQL?

...