2012-11-27 187 views
2

我有以下值,我想在我的IQueryable数据源中查找。通配符搜索

用户可以通过在我的Silverlight应用程序的文本框中输入值来过滤结果,然后过滤这些输入并将其发送到我的域服务。

“*”是用户可以输入的用于进行通配符搜索的内容,例如返回'TYPE'以“P32”开头的所有值。

List<string> params = new List<string>() { "P32*", "P4552", "P2311" }; 

然后我通过这个列表的功能,在我的域名服务代码:

IQueryable<MyClass> temp = this.ObjectContext.MyClass.AsQueryable(); 
temp = temp.Where(c => params.Contains(c.TYPE)); 

这是我做之前,我想要实现我的通配符搜索。最干净的方法是什么?我想我不得不通过我的PARAMS名单做这样的事情循环,并尝试一下包含每一个串(后一些更多的字符串操作),但这种方式感觉如此不洁

foreach (string x in params) 
{ 
    //look for * wildcard... do some other stuff 
    temp = temp.Where(c=>c.TYPE.Contains(x)); 
} 
+0

请记住,你的解决方案是“真正的”通配符使用像'*'这样的通配符匹配不起作用。例如“P32 *”不匹配“P32Whatever”,但“P4552”匹配“HelloP4552World”。 虽然......但是仍在考虑更好的解决方案 – Spontifixus

+0

为了简单起见,我保留了这一点,但回头看,我应该掀起一些东西。幸运的是,我可以假设我的输入始终是'P',然后是4位数。 – user1384831

回答

1

为了做到这一点,你需要完全定义通配符的工作方式。一旦你这样做,你可以填补空白以下功能:

public static class WildcardExtensions 
{ 
    public static bool WildcardContains(this IEnumerable<string> patterns, string value) 
    { 
     return patterns.Any(pattern => MatchesWildcard(pattern, value)); 
    } 

    private static bool MatchesWildcard(string pattern, string value) 
    { 
     // implement your pattern matching logic here 
    } 
} 

然后你的代码变化不大:

temp = temp.Where(c => params.WildcardContains(c.TYPE)); 
+0

由于产出,我得到一个错误,说“Bool不是迭代器接口类型”。为WildcardContains返回'IEnumerable '不会让我使用“temp = temp.Where(c => params.WildcardContains(c.TYPE));”因为它期待一个单一的布尔。我如何返回WildcardContains? – user1384831

+0

Opps,没错,你必须实际返回一个bool,而不是试图返回一个bools的枚举。 –

+0

那么修复它,但现在当我试图在调试器中查看我的临时结果时,它说“LINQ to Entities不识别该方法”布尔WildcardContains(System.Collections.Generic.IEnumerable'1 [System.String], System.String)'方法,并且此方法不能转换为商店表达式。“} \t System.SystemException {System.NotSupportedException}”。不让我用这个函数得到任何东西,即使当我明确地将结果映射到一个类 – user1384831