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