假设我有一个方法的5个参数,那些是3个不同的表中的列。方法调用者可以将null传递给所有参数。我的Linq的一部分
public Customer GetCustomer(int id, DateTime? dob, string FName, string MI, string LName)
{
query = (from customer in CustomerDb.customers
join
,...
where cpn.FirstName == FName && cpn.LName == LName
..
select customer);
}
现在,如果他们只提供FName,我希望我的where子句只包含FName属性。而if-else或switch case是实现这一目标的唯一方法吗?我不能用查询将所有内容放入查询中,因为如果它们只提供FName,我将在dob,id,MI和LName中查找空值。并且它们可以将null传递给所有值(在int的情况下为0)也意味着我需要返回DB中的所有值而不是空值的AND。
答案 0 :(得分:2)
您可以简单地扩展您在哪里考虑默认值:
where (FName == null || cpn.FirstName == FName) && (LName == null || cpn.LName == LName)
它会使一点点复杂,但我认为没有理由为什么它会失败或表现不佳。
答案 1 :(得分:1)
我需要返回数据库中的所有内容而不是空值的AND。
使用Lambda:
public Customer GetCustomer(int? id, DateTime? dob, string fName,
string mi, string lName)
{
IQuerable<Customer> query = CustomerDb.customers;
if (id.HasValue)
{
query = query.Where(c => c.id == id.Value)
}
else
{
query = query.Where(c => c.id == null)
}
if (dob.HasValue)
{
query = query.Where(c => c.Dob == dob.Value)
}
else
{
query = query.Where(c => c.Dob == null)
}
if (!string.IsNullOrWhitespace(fName))
{
query = query.Where(c => c.FName == fName)
}
else
{
query = query.Where(c => c.Fname == null)
}
// repeat for mi, lName
var result = query.FirstOrDefault();
return result;
}
如果您不希望过滤掉没有传递的值,只需删除您选择的else语句。