2012-04-17 67 views
1

我想设计一个LINQ查询,在特定位置进行过滤。在我的用户界面下拉列表中,该下拉列表中的第一个条目为“所有网站”。因此,当查询将“所有网站”视为值时,它不应执行过滤器。这可能没有多大意义,但这是我如何用SQL来做到这一点..C#lambda语句与快速测试

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> 
+0

为什么你不想要吗? – Likurg 2012-04-17 09:38:04

+0

我假设查询缩短了,并且有更多的语句。如果你不想保持重复查询,他的方法是有效的,恕我直言。 – Till 2012-04-17 09:49:37

回答

1

您的下拉通常不会刚刚文本,它通常会被绑定到文本/值对。因此,读入New South Wales的文本条目将具有相应的值NSW。条目​​的值为null。所以,你可以查询更改为:

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

逻辑快捷键适用于表达,所以如果传递的LOC值不为空的j.Location1.Description只会进行比较。

使用中性位置值很重要 - 您并不是真的想比较文字文本​​出于一系列原因。

0

只是用OR运营商查询转换为LINQ:

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

不完全肯定这将工作:

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

试试这个

var dataSetB = db.Data; 
if (loc != 'All Sites') 
    dataSetB = dataSetB 
       .Where(j => loc != 'All Sites' && j.Location1.Description.Equals(loc)); 
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 
0

我不知道你想使用LINQ的“所有网站”的情况。

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

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

0

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

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