【问题标题】:Elegant Boolean LINQ Query flexible for Active = true or Active = true or false优雅的布尔 LINQ 查询灵活用于 Active = true 或 Active = true 或 false
【发布时间】:2016-11-22 11:38:00
【问题描述】:

我有一个 LINQ 查询来返回查找数据。传入一个 bool 参数,称为 active。

我想要么只返回 active = true 的行 或者 无论活动状态如何,都返回所有行 在 LINQ 的 where 子句中是否有一种优雅的方法可以做到这一点?

          return await (from p in db.PackSizeTypes.AsNoTracking()
          where p.Active == true
          orderby p.ID

          select new PackSizeTypeObject
          {
              ID = p.ID,
              Name = p.Name.Trim(),
              LastEditedDate = p.LastEditedDate,
              LastEditedBy = p.LastEditedBy,
              Active = p.Active
          }).ToListAsync();

有没有办法在 where 子句中使用三元运算符来提供这个开关?

【问题讨论】:

  • 如果你想要真正的或全部,那不就是全部吗?
  • 是的,但在处理表单上,它必须只显示 active = true 的位置。在配置表单上,它必须显示 active = 无关紧要:-)
  • 我想知道您是如何决定是只获得活动条目还是所有条目?有第二个参数吗?
  • 有办法,但优雅的LINQ并不意味着优雅的SQL。实际上优雅的 LINQ 解决方案会产生糟糕的低效 SQL 查询。如果您问我,请忘记优雅并使用有条件的Where
  • 低效的 SQL 可以解决这个问题,因为查找表中的条目少于 20 个,并且不太可能超过该行数。

标签: c# entity-framework linq


【解决方案1】:
 IEnumerable<PackSizeTypeObject> MyPackSizeTypeObjects(bool? isActive)
{

return await (from p in db.PackSizeTypes.AsNoTracking()
          where  p.Active == (isActive == null ? p.Active : isActive)
          orderby p.ID

 select new PackSizeTypeObject
      {
          ID = p.ID,
          Name = p.Name.Trim(),
          LastEditedDate = p.LastEditedDate,
          LastEditedBy = p.LastEditedBy,
          Active = p.Active
      }).ToListAsync();
}

【讨论】:

  • 太棒了 - 这就像一个魅力!不知道为什么我不考虑可以为空的布尔值。谢谢各位!
猜你喜欢
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 2017-09-16
  • 2013-10-11
相关资源
最近更新 更多