【问题标题】:Add a if statement condition to a Linq statement将 if 语句条件添加到 Linq 语句
【发布时间】:2019-06-25 22:37:32
【问题描述】:

我想要一种干净的方法来向现有的 linq 语句添加条件。我有一个新变量personContactRoleId,它将为零或不为零。

context.PersonContactRoles
          .Where(pcr => pcr.PersonId == personId);                        
          .ToList()
          .ForEach(pcr =>
          {
              // a lot of code
          }

我能够使用 if 语句通过 iqueryable 延迟执行来解决它,但它看起来相当丑陋并且性能可能更低?有什么更好用的吗?

var query = context.PersonContactRoles
          .Where(pcr => pcr.PersonId == personId);                        

if(personContactRoleId != 0)
{
    query = query.Where(b => b.PersonContactRoleId == personContactRoleId);
}

var results = query.ToList();
results.ForEach(pcr =>
{
    // a lot of code
}

同样,这是可行的,但正在寻找一种更清洁的方法

【问题讨论】:

  • 第二个代码示例中的if 语句不会使事情变慢。怎么可能……
  • @elgonzo 我敢打赌,很多人没有正确意识到与 LINQ 相关的延迟加载,并认为第一个 query 已处理,然后 if 语句已处理,如果它落入其中然后修改query。如果您熟悉这一切是如何工作的,这是显而易见的事情,但如果您不熟悉,那么您可能会认为它遵循我刚才描述的模式,从而使您认为它很慢并且实际上是在枚举查询两次,不止一次。只是我的猜测。
  • @gilliduck,我的评论显然是针对 OP 的。 Chad 本人已经意识到 Linq 可查询对象的延迟执行性质(不包括产生单例值的查询)。请注意问题中用粗体写的文字。

标签: c# .net linq linq-to-sql linq-to-entities


【解决方案1】:

您的解决方案很好,但是如果您想将所有内容放入一个没有if 的查询中,您可以添加一个额外的Where 条件,该条件返回personContactRoleId == 0prc.PersonContactRoleId == personContactRoleId 为真的记录:

context.PersonContactRoles
    .Where(pcr =>
        pcr.PersonId == personId &&
        (personContactRoleId == 0 || pcr.PersonContactRoleId == personContactRoleId))
    .ToList()
    .ForEach(pcr =>
    {
        // a lot of code
    });

【讨论】:

    【解决方案2】:

    这不需要 if 块来检查 personContactRoleId 是否为 0

    var query = context.PersonContactRoles
                  .Where(pcr => pcr.PersonId == personId).Where(b => {
        return b.PersonContactRoleId == personContactRoleId && personContactRoleId != 0
    
        }).ToList().ForEach(pcr =>
        {
            // a lot of code
        }   
    

    【讨论】:

    • 这和原始代码不同,但是,他们想在personContactRoleId == 0时添加所有记录,并且仅在personContactRoleId != 0时过滤它们...
    猜你喜欢
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多