我正在一个搜索页面上工作,用户可以*
在其搜索条件中使用通配符。通配符可以放在字符串的开头或结尾。由于我需要将其应用于多个领域,因此我认为扩展方法将是最好的方法。我想出的代码目前有效,但不适用于IQueryable
.
public static class Helper
{
public static IEnumerable<string> MyExtMethod(this IEnumerable<string> items, string searchString)
{
var searchType = -1;
if(searchString.IndexOf("*") == -1) //No wildcard
{
searchType = 0;
}
else if(searchString.IndexOf("*") == 0 && searchString.LastIndexOf("*") == searchString.Length - 1)//start and end
{
searchType = 1;
}
else if(searchString.IndexOf("*") == 0)//ends with
{
searchType = 2;
}
else if(searchString.LastIndexOf("*") == searchString.Length - 1) //starts with
{
searchType = 3;
}
var search = searchString.Replace("*", "");
foreach(var i in items)
{
switch(searchType)
{
case 0: yield return i;
break;
case 1: if(i.Contains(search))
yield return i;
break;
case 2: if(i.EndsWith(search))
yield return i;
break;
case 3: if(i.StartsWith(search))
yield return i;
break;
}
}
}
}
Contains
我只使用 L2E 、StartsWith
、已经支持的字符串操作和扩展方法EndsWith
。这可以转换为与实体一起使用吗?如果是这样,需要做什么?谢谢。
编辑:如果可能的话,我希望能够这样使用它:
db.SomeTable.Where(s => s.SomeField.MyExtMethod(somestring));
参考来源的奖励积分。