带有快速测试的 C# Lambda 语句

本文关键字:Lambda 语句 测试 | 更新日期: 2023-09-27 18:31:26

我正在尝试设计一个在特定位置进行过滤的 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# Lambda 语句

您的下拉列表通常不会只有文本,它通常会绑定到文本/值对。因此,读取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

不完全确定这是否有效:

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

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

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

试试这个

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

像这样改用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
我不知道

您是否要将 LINQ 用于"所有站点"情况。

检查下拉值 == "所有站点"。

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

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

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