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

Ответ 1

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

Вы также можете использовать .StartsWith() или .EndsWith().

Ответ 2

Используйте это:

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

Ответ 3

Я предполагаю, что вы используете Linq-to-SQL * (см. примечание ниже). Если это так, используйте string.Contains, string.StartsWith и string.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 нет другого лучшего дискриминатора.
Обновление:. Это исправлено в EF/L2E v4 (.net 4.0), поэтому он будет генерировать SQL LIKE так же, как L2S.

Ответ 4

Если вы используете VB.NET, тогда ответ будет "*". Вот что должно выглядеть ваше предложение where...

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

Примечание: "*" Соответствует нулю или нескольким символам. Вот статья msdn для оператора Like.

Ответ 6

Хорошо indexOf работает и для меня тоже

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

Ответ 7

Используйте такой код

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

Ответ 8

Если вы не согласны с числовыми строками, всегда хорошо иметь общий случай:

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

Ответ 10

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

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

Ответ 11

Я всегда это делаю:

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

Я знаю, что я не использую подобный оператор, но он отлично работает в фоновом режиме, это переводится в запрос с похожим утверждением.

Ответ 12

Содержит используется в Linq, точно так же, как Like используется в SQL.

string _search="/12/";

.,.

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

Вы можете написать свой SQL script в Linq следующим образом:

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

Ответ 13

Для тех, кому так нравится, как я, ищет способ использовать метод SQL Like в LINQ, у меня есть что-то очень хорошее.

Я в том случае, когда я не могу изменить базу данных каким-либо образом, чтобы изменить сортировку столбцов. Поэтому я должен найти способ в LINK, чтобы сделать это.

Я использую вспомогательный метод 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;
        }
    }

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

Ответ 14

Ядро.NET теперь имеет EF.Functions.Like

Ответ 15

System.Data.Linq.SqlClient.SqlMethods.Like("mystring", "%string")