как конвертировать запрос linq в лямбда-выражение - PullRequest
0 голосов
/ 17 февраля 2020

Я написал Linq Query , что я хотел сделать это Лямбда-выражение . как написать лямбда-выражение вместо оператора возврата Linq Query . таблицы сущностей - это сущности.

 public async Task<IHttpActionResult> GetAllData(int deviceid)
        {
            using (smartpondEntities entities = new smartpondEntities())
            {
                try
                {
                    return Ok(await entities.ponds.Where(u=>u.deviceid==deviceid).OrderByDescending(u => u.timestatmp).ToListAsync());
                }
                catch (Exception Ex)
                {
                    return BadRequest("Sorry Error Found!!!");
                }
            }
        }

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Это в значительной степени отображение 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 запрос.

0 голосов
/ 17 февраля 2020

У тебя, лямда, должно быть:

var ponds = from pond in Ponds
join customerdevice in CustomerDevices on pond.Imei equals customerdevice.Imei
join user in Users on customerdevice.CustomerId equals user.CustomerId
where user.Username=="user1"
select new { temp = pond.Temp, imei = pond.Imei,timestamp=pond.Timestatmp }

Затем запрос (я заменил deviceid на imei).

return Ok(await entities.ponds.Where(u=>u.imei==deviceid).OrderByDescending(u => u.timestatmp).ToListAsync());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...