LikeOperatorsinLINQtoEntities或UsingWildcards我正在使用LINQ2实体。这是问题所在:stringstr='%test%.doc%'.Contains(str)//将其转换为LIKE'%~%test~%.doc~%%'预期转换:LIKE'%test%.doc%'如果它是LINQ2SQL,我可以使用SqlMethods.Like,就像有人在我之前的问题中回答的那样。但是现在由于我使用的是L2E而不是L2S,所以我需要其他解决方案。您可以试试这篇文章,作者在其中描述了如何在LINQtoEntities中使用通配符构建LIKE语句。编辑:由于原始链接现已失效,这里是原始扩展类(评论中的JonKoeter)和用法示例。后期:publicstaticclassLinqHelper{//支持IQueryable(LinqtoEntities)publicstaticIQueryableWhereLike(thisIQueryablesource,Expression>valueSelector,stringvalue,charwildcard){returnsource.Where(BuildLikeExpression(valueSelector,value,wildcard));}//支持IEnumerable(Linqtoobjects)publicstaticIEnumerableWhereLike(thisIEnumerablesequence,Funcexpression,stringvalue,charwildcard){varregEx=WildcardToRegex(value,wildcard);//防止多重枚举:vararraySequence=sequenceasTSource[]??序列.ToArray();尝试{returnarraySequence.Where(item=>Regex.IsMatch(expression(item),regEx));}catch(ArgumentNullException){返回arraySequence;}}//用于IEnumerable支持privatestaticstringWildcardToRegex(stringvalue,charwildcard){return"(?i:^"+Regex.Escape(value).Replace("\"+wildcard,"."+wildcard)+"$)";}//用于支持IQueryable的privatestaticExpression>BuildLikeExpression(Expression>valueSelector,stringvalue,charwildcard){if(valueSelector==null)thrownewArgumentNullException("valueSelector");}var方法=GetLikeMethod(值,通配符);value=value.Trim(通配符);varbody=Expression.Call(valueSelector.Body,method,Expression.Constant(value));varparameter=valueSelector.Parameters.Single();返回Expression.Lambda>(body,parameter);}privatestaticMethodInfoGetLikeMethod(stringvalue,charwildcard){varmethodName="Equals";vartextLength=value.Length;value=value.TrimEnd(通配符);如果(textLength>value.Length){methodName="StartsWith";textLength=value.Length;}value=value.TrimStart(通配符);如果(textLength>value.Length){methodName=(methodName=="StartsWith")?“包含”:“以结尾”;}varstringType=typeof(string);返回stringType.GetMethod(methodName,new[]{stringType});}}使用方法示例:stringstrEmailToFind="%@yahoo.com"IQueryablemyUsers=entities.Users.WhereLike(u=>u.EmailAddress,strEmailToFind,'%');或者,如果您希望您的用户更习惯使用Windows资源管理器样式的通配符:;SQL方法PATINDEX提供与LIKE相同的功能因此,您可以使用SqlFunctions.PatIndex方法:.Where(x=>SqlFunctions.PatIndex("%test%.doc%",x.MySearchField)>0)FollowingonfromMagnus的正确答案,这是一个扩展方法,可以在我的项目中根据需要重复使用。publicstaticclassLinqExtensions{publicstaticExpression>WildCardWhere(thisExpression>source,Expression>selector,stringterms,charseparator){if(terms==null||selector==null)返回源;foreach(术语中的字符串术语。拆分(新[]{分隔符},StringSplitOptions.RemoveEmptyEntries)){字符串当前=术语;source=source.And(Expression.Lambda>(Expression.Call(selector.Body,"Contains",null,Expression.Constant(current)),selector.Parameters[0]));}返回源;}}用法:varterms="%test%.doc%";表达式>whereClause=d=>d;whereClause=whereClause.WildCardWhere(d=>d.docName,terms,'%');whereClause=whereClause.WildCardWhere(d=>d.someOtherProperty,"another%string%of%terms",'%');varresult=ListOfDocs.Where(whereClause).ToList();此扩展使用来自http://petemontgomery.wordpress.com/2011/02/10/a-universal-predicatebuilder/的谓词生成器。生成的SQL对表执行单表扫描,无论其中有多少项。如果你想要iQueryable的扩展,你可以从JoVdb开始。使用正则表达式...以下将使用System;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.Text.RegularExpressions;使用System.IO;命名空间RegexFileTester{类程序{staticvoidMain(string[]args){string[]_files=Directory.GetFiles(".");var_fileMatches=fromiin_fileswhereRegex.IsMatch(i,".*test*.doc.*")//whereRegex.IsMatch(i,".*cs")选择i;foreach(var_filein_fileMatches){控制台。写行(_文件);}}}}拆分字符串varstr="%test%.doc%";vararr=str.Split(new[]{'%'},StringSplitOptions.RemoveEmptyEntries);varq=tblUsers.Select(u=>u);foreach(variteminarr){varlocalItem=item;q=q.Where(x=>x.userName.Contains(localItem));所以我尝试了同样的事情——尝试配对List以返回所有匹配SearchTerm的候选人。我想要这样,如果用户键入“亚利桑那”,它会返回所有内容,而不管亚利桑那州。此外,如果用户输入“ArizonaCha”,它将返回诸如“ArizonaLicenseChange”之类的项目。以下工作:以上是C#学习教程:所有分享的内容,如LINQtoEntities中的运算符或使用通配符,如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——私有列表GetCertListBySearchString(){string[]searchTerms=SearchString.Split('');列出allCerts=_context.Certifications.ToList();allCerts=searchTerms.Aggregate(allCerts,(current,thisSearchString)=>(fromacincurrentwhereac.Name.ToUpper().Contains(thisSearchString.ToUpper())selectac).ToList());返回所有证书;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
