假设我们有下表:
Person:
PersonID,
Name,
Age,
Gender
Run Code Online (Sandbox Code Playgroud)
我们提供的搜索功能允许用户根据名称和/或年龄搜索表格.
编写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
Run Code Online (Sandbox Code Playgroud)
现在过了一段时间,代码变得非常冗长和混乱...如何将上述内容压缩为单个查询而不使用if-else?
尝试这样的代码
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);
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作.如果没有给出personName,它将不会添加到where,如果给出则会添加.
我在SQL中使用的一个替代方案也可以在Linq中实现
var p = from p in Person
where p.Name == Name_TextBox || Name_TextBox == String.Empty
select p;
Run Code Online (Sandbox Code Playgroud)
(请注意,你的'linq'使用的是SQL语法,它不会编译.你也不能像没有直接赋值那样声明var)