Это в значительной степени отображение 1-1.
entities.Ponds
.Join(entities.CustomerDevices, pond => pond.Imei, device => device.Imei, new {pond,device});
.Join(entities.Users, devicePond => devicePond.deviceCustomerId, user => user.CustomerId, new {devicePond.pond, devicePond.device, user})
.Where( e => e.user.Username == "user1")
.Select( e => new { temp = e.pond.Temp, imei = e.pond.Imei,timestamp=e.pond.Timestatmp })
.ToListAsync();
Тем не менее, я бы предложил вам добавить некоторые навигационные свойства для ваших сущностей, чтобы сократить запросы Linq и заставить EF генерировать соединения для вас.
public class Ponds {
public string Imei {get;set}
[ForeignKey(nameof(Imei))]
public virtual CustomerDevice Device {get;set;}
}
public class CustomerDevices {
[Key]
public string Imei {get;set}
public int CustomerId {get;set;}
public int DeviceId {get;set;}
[ForeignKey(nameof(CustomerId))]
public virtual User Customer {get;set;}
}
public class Users {
[Key]
public int CustomerId {get;set;}
}
Сокращение запроса:
this.entites.Ponds.Where (
e => e.Device.Customer.Username == "user1" ||
e.Device.DeviceId == 1
)
.Select( e => new { temp = e.Temp, imei = e.Imei,timestamp=e.Timestatmp })
.FirstOrDefaultAsync();
Затем следует рассмотреть возможность использования чего-то вроде SQLProfiler, если вы используете для просмотра MS DB, а затем оптимизировать EF- SQL запрос.