Как сделать SQL, как % в Linq?
у меня есть процедура в 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 / % для его поиска.
мой вопрос в том, что такое Linq или .NET эквивалентно использованию знака процента?
12 ответов:
.Where(oh => oh.Hierarchy.Contains("/12/"))вы также можете использовать
.StartsWith()или.EndsWith().
Я предполагаю, что вы используете Linq-to-SQL* (см. Примечание ниже). Если да, то используйте строку.Содержит строку.Startswith и строки.EndsWith для создания SQL, которые используют оператор SQL LIKE.
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 }Примечание: * = если вы используете ADO.Net Entity Framework (EF / L2E) в .net 3.5 следует учитывать, что он не будет выполнять тот же перевод, что и Linq-to-SQL. Хотя L2S делает правильный перевод, L2E v1 (3.5) преобразуется в выражение t-sql, которое будет полное сканирование таблицы выполняется запрос если есть другой лучший дискриминатор в предложении where или Join фильтров.
обновление: это фиксируется в эф/L2E В4 (.net версии 4.0), так что он будет генерировать SQL, как просто, как L2S делает.
Если вы используете VB.NET тогда ответ будет"*". Вот как будет выглядеть ваше предложение where...
Where OH.Hierarchy Like '*/12/*'Примечание: "*" соответствует нулю или более символов. вот статья msdn для оператора Like.
ну 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; }
Если вы не соответствуете числовым строкам, всегда хорошо иметь общий случай:
.Where(oh => oh.Hierarchy.ToUpper().Contains(mySearchString.ToUpper()))
попробуйте это, это отлично работает для меня
from record in context.Organization where record.Hierarchy.Contains(12) select record;
Я всегда делаю так:
from h in OH where h.Hierarchy.Contains("/12/") select hЯ знаю, что не использую оператор like, но он отлично работает в фоновом режиме, это переводится в запрос с оператором like.
содержит используется в Linq, как и как используется в SQL .
string _search="/12/";. . .
.Where(s => s.Hierarchy.Contains(_search))вы можете написать свой SQL-скрипт в Linq следующим образом:
var result= Organizations.Join(OrganizationsHierarchy.Where(s=>s.Hierarchy.Contains("/12/")),s=>s.Id,s=>s.OrganizationsId,(org,orgH)=>new {org,orgH});
для тех, как падение здесь, как я ищу способ "SQL, как" метод в LINQ, у меня есть что-то, что работает очень хорошо.
Я в случае если я не могу изменить базу данных в любом случае, чтобы изменить параметры сортировки столбца. Так что я должен найти способ в моем LINQ, чтобы сделать это.
Я использую вспомогательный метод
SqlFunctions.PatIndexведьма действует аналогично реальному оператору SQL LIKE.сначала мне нужно перечислить все возможные диакритические знаки (слово, которое я просто узнал) в поисковом значении получить что-то вроде:
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; } }если у кого-то из вас есть предложение по улучшению этого метода, я буду рад вас услышать.
Comments