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

664   12  

12 ответов:

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

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

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

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

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

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

.NET core теперь имеет EF.Functions.Like

Comments

    Ничего не найдено.