Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 通配符搜索_Linq_Silverlight_.net 4.0_Linq To Entities - Fatal编程技术网

Linq 通配符搜索

Linq 通配符搜索,linq,silverlight,.net-4.0,linq-to-entities,Linq,Silverlight,.net 4.0,Linq To Entities,我想在IQueryable数据源中查找以下值 用户可以在我的Silverlight应用程序的文本框中键入值以过滤结果,然后过滤这些输入并发送到我的域服务 “*”是用户可以输入以进行通配符搜索的内容,例如,返回“TYPE”以“P32”开头的所有值 为此,您需要完全定义通配符的工作方式。完成此操作后,只需填写以下函数的空格即可: public static class WildcardExtensions { public static bool WildcardContains(this

我想在IQueryable数据源中查找以下值

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

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


为此,您需要完全定义通配符的工作方式。完成此操作后,只需填写以下函数的空格即可:

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
    }
}

请记住,在您的解决方案中,使用通配符(如
*
)进行“真正的”通配符匹配是行不通的。例如,“P32*”将与“P32Whatever”不匹配,但“P4552”将与“HelloP4552World”匹配。但仍在考虑更好的解决方案……;)为了简单起见,我把它保留了下来,但回头看,我本应该做点什么的。幸运的是,我可以假设我的输入总是先是“P”,然后是4位数字。由于产量的原因,我得到一个错误,说“Bool不是迭代器接口类型”。为WildcardContains返回'IEnumerable'不允许我使用“temp=temp.Where(c=>params.WildcardContains(c.TYPE));”,因为它需要一个bool。如何返回WildcardContains?没错,您必须返回bool,而不是尝试返回bool的枚举。这已经解决了问题,但现在当我尝试在调试器中查看temp结果时,它会说“LINQ to Entities无法识别方法‘Boolean WildcardContains(System.Collections.Generic.IEnumerable`1[System.String],System.String)“”方法,而此方法无法转换为存储表达式。“}System.SystemException{System.NotSupportedException}"。即使我显式地将结果映射到一个类,也不允许我使用此函数获取任何信息。您是否尝试将其用于数据库查询?这不会起作用。像这样的自定义逻辑只能在已从数据库中具体化的实体上执行。是的,我在我的Entity Framework 4.0数据模型上使用此LINQ。不幸的是ely,这似乎是最好的也是唯一的解决方案,因为我尝试过的其他方法都不起作用:|
IQueryable<MyClass> temp = this.ObjectContext.MyClass.AsQueryable();
temp = temp.Where(c => params.Contains(c.TYPE));
foreach (string x in params)
{
    //look for * wildcard... do some other stuff 
    temp = temp.Where(c=>c.TYPE.Contains(x));
}
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));