选择所有参数

本文关键字:参数 选择 | 更新日期: 2023-09-27 18:14:33

假设一个方法有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情况是实现这一目标的唯一方法吗?我不能把所有的查询与和,因为如果他们只提供一个FName,我将寻找空dob, id, MI和LName。它们可以将null传递给所有值(0在int的情况下),这意味着我需要返回DB中的所有内容,而不是null的And。

选择所有参数

您可以简单地扩展您的where来解释默认值:

where (FName == null || cpn.FirstName == FName) && (LName == null || cpn.LName == LName) 

这会使位置变得复杂一些,但我看不出为什么它会失败或表现不佳。

我需要返回DB中的所有内容,而不是null的AND。

使用λ

:

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语句。