EF6:在IQueryable中搜索名称的有效方法

时间:2016-11-30 10:50:39

标签: c# asp.net-mvc entity-framework

我编写的应用程序有一个搜索栏,允许用户按名称搜索人员 - 名字,中间名和姓氏

搜索输入可以是名字或中间名或姓氏。或者First和name的组合;第一名和中名等......

或全名。

现在我正在这样做:

 var result = People.Where(e => e.FirstName.ToLower().Contains(model.Name.ToLower()) || e.LastName.ToLower().Contains(model.Name.ToLower()) || e.MiddleName.ToLower().Contains(model.Name.ToLower()));

我想知道这是最有效的方式还是可以改进?

3 个答案:

答案 0 :(得分:4)

正如 Marco Alves 所说,您可以这样使用LINQKit库:

var predicate = PredicateBuilder.New<People>();
if(!String.IsNullOrEmpty(model.FirstName))
   predicate = predicate.Or(p => p.FirstName.Contains(model.FirstName));
if(!String.IsNullOrEmpty(model.LastName))
   predicate = predicate.Or(p => p.LastName.Contains(model.LastName));
if(!String.IsNullOrEmpty(model.MiddleName))
   predicate = predicate.Or(p => p.MiddleName.Contains(model.MiddleName));

var result = context.People.AsExpandable().Where(predicate).ToList();

答案 1 :(得分:0)

你可能正在寻找类似Predicate Builder的东西,它允许你更容易地控制where语句的AND和OR。

还有Dynamic Linq允许您像SQL字符串一样提交WHERE子句,它会将其解析为WHERE的正确谓词。

答案 2 :(得分:0)

您可以考虑连接所有姓名并检查var result = People.Where(e => (e.FirstName + " " + e.MiddleName + " " + e.LastName).IndexOf(model.Name) > -1);

while (value != 5);