我正在创建一个连接到DB的wcf应用程序,以便使用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);
请建议我如何仅使用少量或一个参数来获得结果,请帮助我。 感谢
答案 0 :(得分:8)
实体框架查询是“延迟”查询。直到你开始要求结果,它们才会真正运行。这意味着您可以逐段构建查询,它(大部分)将完全像一个更大的查询。
在您的情况下,您可以执行以下操作:
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查询。
答案 1 :(得分:2)
假设您只想查找与所有非空参数匹配的客户,另一种方法是在where查询中包含空检查,并且仅在参数不为null时将参数与客户数据进行比较。 / p>
customers = customers.Where(c => (string.isNullOrEmpty(sName) || c.Name == sName)
&& (iAge == null || c.Age == iAge)
&& (string.isNullOrEmpty(sGender) || c.Gender == sGender));
答案 2 :(得分:1)
您需要某种方法来确定是否设置了给定的输入。为简化起见,我假设您接收的参数为nullables。因此,如果提供了参数,您可以添加其他条件:
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);
...