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