【问题标题】:C# Lambda Statement with Express Test带有快速测试的 C# Lambda 语句
【发布时间】:2012-04-17 09:33:45
【问题描述】:

我正在尝试设计一个过滤特定位置的 LINQ 查询。在我的 UI 下拉列表中,该下拉列表的第一个条目为“所有站点”。因此,当查询将“所有站点”视为值时,它不应该执行过滤器。这可能没有多大意义,但这就是我过去在 SQL 中的做法..

select * from table
where ((location = @loc and @loc is not null) or (@loc is null))

这就是我在 LINQ 中尝试的方式。

var dataSetB = db.Data
.Where(j => loc != 'All Sites' && j.Location1.Description.Equals(loc));

问题在于,当用户选择“所有站点”时 - 没有返回任何结果,而我期望所有结果都没有按位置过滤。

有谁知道如何在一个 LINQ 语句中完成这项工作?

示例下拉菜单..

<All Sites>
<Sydney>
<New York>
<London>

【问题讨论】:

  • 我假设查询被缩短并且有更多的语句。如果您不想维护重复的查询,他的方法是有效的,恕我直言。

标签: c# sql linq linq-to-sql lambda


【解决方案1】:

您的下拉菜单通常不会只有文本,它通常会绑定到文本/值对。因此,您的文本条目为New South Wales,对应的值为NSW。读取All Sites 的条目将具有null 的值。因此,您可以将查询更改为:

public object GetMyStuff(string loc)
{
    var dataSetB = db.Data
                     .Where(j => loc == null || j.Location1.Description == loc);
}

表达式中应用了逻辑快捷方式,因此只有在传递的 loc 值不为 null 时才会比较 j.Location1.Description

使用中性位置值很重要 - 您真的不想比较文字文本 All Sites 有很多原因。

【讨论】:

    【解决方案2】:

    不完全确定这是否可行:

    var dataSetB = db.Data
      .Where(j => loc != 'All Sites' ? j.Location1.Description.Equals(loc) : true);
    

    【讨论】:

      【解决方案3】:

      只需使用 OR 运算符将您的查询转换为 LINQ:

      var dataSetB = db.Data
                .Where(j => loc == 'All Sites' 
                            || j.Location1.Description.Equals(loc));
      

      【讨论】:

        【解决方案4】:

        试试这个

        var dataSetB = db.Data;
        if (loc != 'All Sites')
            dataSetB = dataSetB
                        .Where(j => loc != 'All Sites' && j.Location1.Description.Equals(loc));
        

        【讨论】:

          【解决方案5】:

          像这样使用if.. else

          var dataSetB = db.Data;
          if(dropdownlist.SelectedIndex != 0)
                dataSetB = dataSetB.Where(j => j.Location1.Description.Equals(loc)); 
          
          //loc should be the dropdown list value
          

          【讨论】:

            【解决方案6】:

            我不知道您想将 LINQ 用于“所有站点”的情况。

            检查下拉值是否 == “所有网站”。

            如果为真,则使用整个数据集。
            如果为 false,则执行 LINQ 查询。

            【讨论】:

              【解决方案7】:

              如果你想要所有结果,过滤器应该接受所有条目,所以我认为正确的语法是:

              var dataSetB = db.Data
                              .Where(j => loc == 'All Sites' || j.Location1.Description.Equals(loc));
              

              【讨论】:

                猜你喜欢
                • 2014-08-24
                • 2012-11-23
                • 2011-10-12
                • 2020-12-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多