Как сделать SQL Like% в Linq? - PullRequest
368 голосов
/ 07 мая 2009

У меня есть процедура в 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 эквивалентно использованию знака процента?

Ответы [ 13 ]

1 голос
/ 15 июля 2015

Попробуй, у меня это нормально работает

from record in context.Organization where record.Hierarchy.Contains(12) select record;
0 голосов
/ 05 октября 2017

Для тех, кто здесь, вроде меня, ищет способ «SQL Like» в 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;
        }
    }

Если у кого-нибудь из вас есть предложение улучшить этот метод, я буду рад вас услышать.

0 голосов
/ 23 сентября 2016

Содержит используется в 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});
...