Ответ 1
.Where(oh => oh.Hierarchy.Contains("/12/"))
Вы также можете использовать .StartsWith()
или .EndsWith()
.
У меня есть процедура в 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 для использования знака процента?
.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, использующего оператор 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.
Если вы используете VB.NET, тогда ответ будет "*". Вот что должно выглядеть ваше предложение where...
Where OH.Hierarchy Like '*/12/*'
Примечание: "*" Соответствует нулю или нескольким символам. Вот статья msdn для оператора Like.
Если вам это понадобилось в LINQ to Entities, вот как: http://jendaperl.blogspot.com/2011/02/like-in-linq-to-entities.html
Хорошо 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()))
Используя построитель предикатов, чтобы сделать запросы Linq хорошей практикой при построении динамических запросов со многими такими условиями. См. эту статью кодекса также
Попробуйте это, это отлично работает для меня
from record in context.Organization where record.Hierarchy.Contains(12) select record;
Я всегда это делаю:
from h in OH
where h.Hierarchy.Contains("/12/")
select h
Я знаю, что я не использую подобный оператор, но он отлично работает в фоновом режиме, это переводится в запрос с похожим утверждением.
Содержит используется в 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});
Для тех, кому так нравится, как я, ищет способ использовать метод 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;
}
}
Если у кого-нибудь из вас есть предложение улучшить этот метод, я буду рад вас услышать.
Ядро.NET теперь имеет EF.Functions.Like
System.Data.Linq.SqlClient.SqlMethods.Like("mystring", "%string")