如何在实体框架中编写条件多重where条件的查询

本文关键字:条件 where 查询 实体 框架 | 更新日期: 2023-09-27 18:11:23

我正在创建一个连接到DB的wcf应用程序,以便使用实体框架为客户获取一些数据。其概念是根据搜索参数搜索客户。用户可以提供全部或几个或至少一个搜索参数。但我是相当新的实体框架,并对如何做到这一点感到困惑。我可以在传统的SQL编码中通过考虑c#方面的If - Else条件来做到这一点。

这是我获取所有参数的代码:

   var customers = from o in natCustomer.CustomerLists
                    select o;
    customers = customers.Where(c => c.Name == sName && c.Age == iAge
        && c.Gender == sGender && c.Height == dHeight && c.Weight == dWeight                             
        && c.Nationality == sNationality
        && c.EyeColor == sEyeColor && c.SpecialMark == sSpecialMark);

请帮助我建议我如何得到只有几个或一个参数的结果。由于

如何在实体框架中编写条件多重where条件的查询

实体框架查询是"延迟"查询。直到你开始要求结果,它们才会真正运行。这意味着您可以将查询分成几个部分,并且它将(大多数)完全像一个更大的查询一样工作。

在您的情况下,您可以这样做:

var customers = from o in natCustomer.CustomerLists
                select o;
if (!string.isNullOrEmpty(sName)) 
  customers = customers.Where(c => c.Name == sName);
if (!string.isNullOrEmpty(sNationality)) 
  customers = customers.Where(c => c.sNationality == sNationality);
if (!string.isNullOrEmpty(SpecialMark )) 
  customers = customers.Where(c => c.SpecialMark == SpecialMark);

等。最后,当您执行customers查询(例如,调用ToList或使用foreach循环)时,EF将把所有较小的Where子句合并到一个SQL查询中,以对您的数据运行。

假设您只想查找与所有非空参数匹配的客户,另一种方法是在where查询中包含空检查,并且仅在参数不为空时将参数与客户数据进行比较。

customers = customers.Where(c => (string.isNullOrEmpty(sName) || c.Name == sName) 
    && (iAge == null || c.Age == iAge)
    && (string.isNullOrEmpty(sGender) || c.Gender == sGender));

您需要某种方法来确定是否设置了给定的输入。为了简化,我假设您接收的参数为空值。因此,如果提供了参数,则可以添加一个附加条件:

customers = sName == null ? customers : customers.Where(c => c.Name == sName);
customers = iAge == null ? customers : customers.Where(c => c.Age == iAge);
customers = sGender == null ? customers : customers.Where(c => c.Gender == sGender);
...