如何做像SQL LINUX中的%?

我有一个SQL程序,我正在试图变成Linq:

SELECT O.Id, O.Name as Organization FROM Organizations O JOIN OrganizationsHierarchy OH ON O.Id=OH.OrganizationsId where OH.Hierarchy like '%/12/%' 

我最关心的是:

 where OH.Hierarchy like '%/12/%' 

我有一个存储像/ 1/3/12 /这样的层次结构的列,所以我只是使用%/ 12 /%来search它。

我的问题是,什么是Linq或.NET等效于使用百分号?

 .Where(oh => oh.Hierarchy.Contains("/12/")) 

您也可以使用.StartsWith().EndsWith()

用这个:

 from c in dc.Organization where SqlMethods.Like(c.Hierarchy, "%/12/%") select *; 

我假设你正在使用Linq-to-SQL *(见下面的注释)。 如果是这样,请使用string.Contains,string.StartsWith和string.EndsWith来生成使用SQL LIKE运算符的SQL。

 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 } 

要么

 from o in dc.Organization where o.OrganizationsHierarchy.Hierarchy.Contains(@"/12/") select new { o.Id, o.Name } 

注意: * =如果您在.net 3.5中使用ADO.Netentity framework(EF / L2E),请注意它不会执行与Linq-to-SQL相同的转换。 尽pipeL2S进行了适当的转换,但是L2E v1(3.5)将转换为t-sqlexpression式,这将强制对要查询的表执行全表扫描,除非在where子句或联接filter中有另一个更好的鉴别器。
更新:这在EF / L2E v4(.net 4.0)中是固定的,所以它将像L2S那样产生一个SQL LIKE。

如果你正在使用VB.NET,那么答案将是“*”。 这里是你的where子句的样子

 Where OH.Hierarchy Like '*/12/*' 

注:“*”匹配零个或多个字符。 这里是Like运算符的msdn文章 。

如果你碰巧在LINQ to Entities中需要它,这里是: http : //jendaperl.blogspot.com/2011/02/like-in-linq-to-entities.html

Well indexOf也适用于我

 var result = from c in SampleList where c.LongName.IndexOf(SearchQuery) >= 0 select c; 

使用这样的代码

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

使用谓词构build器进行Linq查询是构build具有许多此类条件的dynamic查询时的一个很好的练习。 也看到这个codeproject文章

试试这个,对我来说工作正常

 from record in context.Organization where record.Hierarchy.Contains(12) select record; 

如果你不匹配数字string,总是有好的情况:

 .Where(oh => oh.Hierarchy.ToUpper().Contains(mySearchString.ToUpper())) 

我经常这样做:

 from h in OH where h.Hierarchy.Contains("/12/") select h 

我知道我不使用类似的声明,但它在后台工作正常,这是翻译成查询与类似的声明。

包含在Linq中使用,就像在SQL中使用一样

 string _search="/12/"; 

。 。 。

 .Where(s => s.Hierarchy.Contains(_search)) 

您可以在Linq中编写您的SQL脚本,如下所示:

  var result= Organizations.Join(OrganizationsHierarchy.Where(s=>s.Hierarchy.Contains("/12/")),s=>s.Id,s=>s.OrganizationsId,(org,orgH)=>new {org,orgH}); 

对于那些像我一样在这里寻找一种方式在LINQ中寻找“SQL Like”方法的人来说,我有一些工作非常好的东西。

我遇到了不能以任何方式更改数据库来更改列归类的情况。 所以我必须在我的LINQ中find一个方法来做到这一点。

我使用的辅助方法SqlFunctions.PatIndex witch的行为类似于真正的SQL LIKE运算符。

首先,我需要枚举search值中所有可能的变音符号(我刚刚学到的一个词),以获得如下所示的内容:

 déjà => d[éèêëeÉÈÊËE]j[aàâäAÀÂÄ] montreal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l montréal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l 

然后以LINQ为例:

 var city = "montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l"; var data = (from loc in _context.Locations where SqlFunctions.PatIndex(city, loc.City) > 0 select loc.City).ToList(); 

所以为了我的需要,我写了一个Helper / Extension方法

  public static class SqlServerHelper { private static readonly List<KeyValuePair<string, string>> Diacritics = new List<KeyValuePair<string, string>>() { new KeyValuePair<string, string>("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ŸÝýyÿ") }; 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; } } 

如果您有任何build议来加强这个方法,我会很高兴听到您的意见。