簡體   English   中英

如何將 linq 查詢轉換為 lambda 表達式

[英]how to convert linq query into lambda expression

我已經編寫了Linq 查詢,我想讓它成為Lambda 表達式 如何編寫Lambda 表達式來代替返回語句Linq Query 實體表是entities.Users,entities.Users,entities.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 }

拉姆達表達式:

 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!!!");
                }
            }
        }

這幾乎是一個 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();

如果您使用 MS DB 進行查看,那么您應該考慮使用 SQLProfiler 之類的東西,然后優化 EF-SQL 查詢。

你 lamda 應該是:

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 }

然后查詢(我用imei替換了deviceid)。

return Ok(await entities.ponds.Where(u=>u.imei==deviceid).OrderByDescending(u => u.timestatmp).ToListAsync());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM