选择所有参数

时间:2014-07-24 15:14:53

标签: c# linq entity-framework

假设我有一个方法的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。

2 个答案:

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