假设我们有下表:
Person:
PersonID,
Name,
Age,
Gender
我们提供的搜索功能允许用户根据名称和/或搜索表格。
编写SQL(或LINQ)查询的棘手部分是用户可以选择搜索字段,任何一个字段或没有字段。如果他想搜索所有内容,那么他只需要将文本框留空。
执行此操作的逻辑可以写成如下:
var p;
if(Name_TextBox=='')
{
p=from row in person
select row ;
}
else
{
p= from row in person
where row.Name=Name_TextBox
select row ;
}
// repeat the same for age
过了一段时间,代码变得非常冗长和混乱...如何使用否if-else 将上述内容压缩为单个查询?
答案 0 :(得分:9)
尝试这样的代码
string personName = txtPersonName.Text;
int personAge = Convert.ToInt32(txtAge.Text);
var opportunites = from p in this.DataContext.Persons
select new
{
p.PersonID,
p.Name,
p.Age,
p.Gender
};
if (personsID != 0)
opportunites = opportunites.Where(p => p.PersonID == personID);
if (personName != string.Empty)
opportunites = opportunites.Where(p => p.Name.StartsWith(personName));
if (personAge != 0)
opportunites = opportunites.Where(p => p.Age == personAge);
这样可以正常工作。如果没有给出personName,它将不会添加到where,如果给出则会添加。
答案 1 :(得分:5)
我在SQL中使用的一个可以在Linq中实现的替代方法是
var p = from p in Person
where p.Name == Name_TextBox || Name_TextBox == String.Empty
select p;
(注意你的'linq'使用的是SQL语法,它不会编译。你也不能像没有直接赋值那样声明一个var)
答案 2 :(得分:2)
为什么不使用空合并运算符?例如
var products = from a in context.products
where a.ID == (productID ?? a.ID)
select a;
这在我的系统上非常有效