How to do SQL Like % in Linq?
我在SQL中有一个过程,我正试图将其转换为LINQ:
1 2 3 4 | SELECT O.Id, O.Name as Organization FROM Organizations O JOIN OrganizationsHierarchy OH ON O.Id=OH.OrganizationsId where OH.Hierarchy like '%/12/%' |
我最关心的是:
1 | where OH.Hierarchy like '%/12/%' |
我有一个列,它像/1/3/12/那样存储层次结构,所以我只使用%/12%/来搜索它。
我的问题是,LINQ或.NET等同于使用百分号是什么?
1 | .Where(oh => oh.Hierarchy.Contains("/12/")) |
您也可以使用
使用此:
1 2 3 | from c in dc.Organization where SqlMethods.Like(c.Hierarchy,"%/12/%") select *; |
我假设您正在使用linq to sql*(请参见下面的注释)。如果是,请使用string.contains、string.startswith和string.endswith生成使用类似SQL的运算符的SQL。
1 2 3 4 | from o in dc.Organization join oh in dc.OrganizationsHierarchy on o.Id equals oh.OrganizationsId where oh.Hierarchy.Contains(@"/12/") select new { o.Id, o.Name } |
或
1 2 3 | from o in dc.Organization where o.OrganizationsHierarchy.Hierarchy.Contains(@"/12/") select new { o.Id, o.Name } |
注意:*=如果在.NET 3.5中使用ADO.NET实体框架(EF/L2E),请注意,它不会执行与LINQ到SQL相同的转换。尽管L2S进行了适当的转换,但L2E v1(3.5)将转换为T-SQL表达式,该表达式将强制对正在查询的表进行全表扫描,除非在WHERE子句或联接筛选器中有另一个更好的鉴别器。更新:这在ef/l2e v4(.net 4.0)中是固定的,因此它将像l2s一样生成SQL。
如果您使用的是vb.net,那么答案将是"*"。这是您的where子句的外观…
1 | Where OH.Hierarchy Like '*/12/*' |
注意:"*"匹配零个或多个字符。这里是类似操作符的MSDN文章。
好指数对我也适用
1 2 3 | var result = from c in SampleList where c.LongName.IndexOf(SearchQuery) >= 0 select c; |
使用这样的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | try { using (DatosDataContext dtc = new DatosDataContext()) { var query = from pe in dtc.Personal_Hgo where SqlMethods.Like(pe.nombre,"%" + txtNombre.Text +"%") select new { pe.numero , pe.nombre }; dgvDatos.DataSource = query.ToList(); } } catch (Exception ex) { string mensaje = ex.Message; } |
.NET核心现在有EDOCX1[3]
如果您不匹配数字字符串,最好使用常见的情况:
1 | .Where(oh => oh.Hierarchy.ToUpper().Contains(mySearchString.ToUpper())) |
1 | System.Data.Linq.SqlClient.SqlMethods.Like("mystring","%string") |
我总是这样做:
1 2 3 | from h in OH where h.Hierarchy.Contains("/12/") select h |
我知道我不使用LIKE语句,但它在后台的工作很好,是否将其转换为带有LIKE语句的查询。
试试这个,这个对我很好
1 | from record in context.Organization where record.Hierarchy.Contains(12) select record; |
对于那些像我这样在Linq中寻找"类SQL"方法的人来说,我有一些非常好的方法。
在这种情况下,我不能以任何方式更改数据库来更改列排序规则。所以我必须在我的LINQ中找到一种方法来做这件事。
我使用的helper方法
首先,我需要枚举搜索值中所有可能的发音符号(我刚刚学过的一个词),以获得如下内容:
1 2 3 | déjà => d[éèê?eéèê?E]j[aàa?Aà??] montreal => montr[éèê?eéèê?E][aàa?Aà??]l montréal => montr[éèê?eéèê?E][aàa?Aà??]l |
然后以Linq为例:
1
2
3
4 var city ="montr[éèê?eéèê?E][aàa?Aà??]l";
var data = (from loc in _context.Locations
where SqlFunctions.PatIndex(city, loc.City) > 0
select loc.City).ToList();
因此,为了我的需要,我编写了一个助手/扩展方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | public static class SqlServerHelper { private static readonly List<KeyValuePair<string, string>> Diacritics = new List<KeyValuePair<string, string>>() { new KeyValuePair<string, string>("A","aàa?Aà??"), new KeyValuePair<string, string>("E","éèê?eéèê?E"), new KeyValuePair<string, string>("U","u?üùU?üù"), new KeyValuePair<string, string>("C","c?C?"), new KeyValuePair<string, string>("I","i??I??"), new KeyValuePair<string, string>("O","????"), new KeyValuePair<string, string>("Y","Y?Yyy?") }; public static string EnumarateDiacritics(this string stringToDiatritics) { if (string.IsNullOrEmpty(stringToDiatritics.Trim())) return stringToDiatritics; var diacriticChecked = string.Empty; foreach (var c in stringToDiatritics.ToCharArray()) { var diac = Diacritics.FirstOrDefault(o => o.Value.ToCharArray().Contains(c)); if (string.IsNullOrEmpty(diac.Key)) continue; //Prevent from doing same letter/Diacritic more than one time if (diacriticChecked.Contains(diac.Key)) continue; diacriticChecked += diac.Key; stringToDiatritics = stringToDiatritics.Replace(c.ToString(),"[" + diac.Value +"]"); } stringToDiatritics ="%" + stringToDiatritics +"%"; return stringToDiatritics; } } |
如果你们中有人建议加强这种方法,我会很高兴听到你们的。
在LINQ中使用contains,就像在SQL中使用contains一样。
1 | string _search="/12/"; |
. …
1 | .Where(s => s.Hierarchy.Contains(_search)) |
您可以在LINQ中编写SQL脚本,如下所示:
1 | var result= Organizations.Join(OrganizationsHierarchy.Where(s=>s.Hierarchy.Contains("/12/")),s=>s.Id,s=>s.OrganizationsId,(org,orgH)=>new {org,orgH}); |