【问题标题】:how to convert linq query into lambda expression如何将 linq 查询转换为 lambda 表达式
【发布时间】:2020-06-01 13:19:20
【问题描述】:

我已经写了 Linq Query,我想把它做成 Lambda 表达式。如何编写 Lambda 表达式 代替 return 语句 Linq 查询。实体表是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 }

Lambda 表达式:

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

【问题讨论】:

  • 我已经修改了我的问题,你可以检查一下

标签: c# linq lambda


【解决方案1】:

你的 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());

【讨论】:

    【解决方案2】:

    这几乎是 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 查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多