如何在Entity Framework中使用多个条件来编写带有条件的查询?

3
我正在创建一个WCF应用程序,使用Entity Framework连接到DB获取客户数据。概念是基于搜索参数搜索客户。用户可以提供所有、部分或至少一个搜索参数。但我在Entity Framework方面还很新,不知道该如何做。在C#端考虑If-Else条件,我可以在传统的SQL编码中完成这个操作。
以下是我的代码,它获取了所有参数:
   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);

请帮助我,建议如何只使用少量或一个参数来获取结果。 谢谢

3个回答

17

实体框架 (Entity Framework) 查询是“延迟”查询。它们直到您开始请求结果才会真正运行。这意味着您可以逐步构建查询,它将(大多数情况下)完全像一个更大的查询一样工作。

在您的情况下,您可以执行以下操作:

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查询,针对您的数据。


我完全按照这样做,IQueryable 是你的好朋友! - Luiz
非常感谢,这正是我一直在寻找的。它真的帮了我很多。 - barsan
当您同时使用LINQ和字符串查询时,这是否可以? - Kamil

2

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

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

1

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

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);
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接