带有Express Test的C#Lambda语句

时间:2012-04-17 09:33:45

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

我正在尝试设计一个过滤特定位置的LINQ查询。在我的用户界面下拉列表中,该下拉列表的第一个条目是“所有网站”#39;因此,当查询查看'所有网站'作为值,它不应该执行过滤器。这可能没什么意义,但这就是我以前在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>

7 个答案:

答案 0 :(得分:1)

不完全确定这会有效:

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

答案 1 :(得分: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 :(得分:0)

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

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

答案 3 :(得分:0)

试试这个

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

答案 4 :(得分: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

答案 5 :(得分:0)

我不知道您想要将LINQ用于“所有网站”案例。

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

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

答案 6 :(得分:0)

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

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