1

我正在尝试设计一个过滤特定位置的 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>
4

7 回答 7

1

不完全确定这会起作用:

var dataSetB = db.Data
  .Where(j => loc != 'All Sites' ? j.Location1.Description.Equals(loc) : true);
于 2012-04-17T09:38:55.310 回答
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);
}

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

All Sites使用中性位置值很重要——出于各种原因,您并不想比较文字文本。

于 2012-04-17T09:42:18.307 回答
0

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

var dataSetB = db.Data
          .Where(j => loc == 'All Sites' 
                      || j.Location1.Description.Equals(loc));
于 2012-04-17T09:38:44.477 回答
0

尝试这个

var dataSetB = db.Data;
if (loc != 'All Sites')
    dataSetB = dataSetB
                .Where(j => loc != 'All Sites' && j.Location1.Description.Equals(loc));
于 2012-04-17T09:38:59.510 回答
0

像这样使用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
于 2012-04-17T09:39:03.213 回答
0

我不知道您是否要将 LINQ 用于“所有站点”案例。

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

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

于 2012-04-17T09:39:36.630 回答
0

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

var dataSetB = db.Data
                .Where(j => loc == 'All Sites' || j.Location1.Description.Equals(loc));
于 2012-04-17T09:40:13.140 回答