wake-up-neo.com

Wie mache ich SQL Like% in Linq?

Ich habe eine Prozedur in SQL, die ich in Linq umwandeln möchte:

SELECT O.Id, O.Name as Organization
FROM Organizations O
JOIN OrganizationsHierarchy OH ON O.Id=OH.OrganizationsId
where OH.Hierarchy like '%/12/%'

Die Linie, die mich am meisten beschäftigt, ist:

where OH.Hierarchy like '%/12/%'

Ich habe eine Spalte, in der die Hierarchie gespeichert ist, z. B./1/3/12 /. Daher verwende ich nur%/12 /%, um danach zu suchen.

Meine Frage ist, was ist die Entsprechung von Linq oder .NET zur Verwendung des Prozentzeichens?

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

Sie können auch .StartsWith() oder .EndsWith() verwenden.

531
andleer

Benutze das:

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

Ich gehe davon aus, dass Sie Linq-to-SQL * verwenden (siehe Hinweis unten). Verwenden Sie in diesem Fall string.Contains, string.StartsWith und string.EndsWith, um SQL-Anweisungen zu generieren, die den SQL LIKE-Operator verwenden.

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 }

oder

from o in dc.Organization
where o.OrganizationsHierarchy.Hierarchy.Contains(@"/12/")
select new { o.Id, o.Name }

Hinweis: * = Wenn Sie das ADO.Net Entity Framework (EF/L2E) in .NET 3.5 verwenden, beachten Sie, dass es nicht die gleiche Übersetzung wie Linq-to-SQL ausführt. Obwohl L2S eine ordnungsgemäße Übersetzung durchführt, wird L2E v1 (3.5) in einen t-sql-Ausdruck übersetzt, der einen vollständigen Tabellenscan für die von Ihnen abgefragte Tabelle erzwingt, sofern Ihre where-Klausel oder Join-Filter keinen anderen besseren Diskriminator enthalten.
pdate: Dies ist in EF/L2E v4 (.net 4.0) behoben. Daher wird ein SQL LIKE wie in L2S generiert.

40
KristoferA

Wenn Sie VB.NET verwenden, lautet die Antwort "*". So würde Ihre where-Klausel aussehen ...

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

Hinweis: "*" Entspricht keinem oder mehreren Zeichen. Hier ist der MSDN-Artikel für den Operator "Gefällt mir" .

27
robertz

Nun, indexOf funktioniert auch für mich

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

Verwenden Sie einen solchen Code

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

.NET Core hat jetzt EF.Functions.Like

2
kofifus

Wenn Sie nicht mit numerischen Zeichenfolgen übereinstimmen, ist es immer gut, die allgemeine Schreibweise zu haben:

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

Ich mache immer das:

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

Ich weiß, dass ich die like-Anweisung nicht verwende, aber im Hintergrund funktioniert sie einwandfrei. Dies wird in eine Abfrage mit einer like-Anweisung übersetzt.

1
H. Pauwelyn
System.Data.Linq.SqlClient.SqlMethods.Like("mystring", "%string")
1
Tan Silliksaar

Versuchen Sie dies, das funktioniert gut für mich

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

Enthält wird in Linq verwendet, genau wie Gefällt mir in SQL verwendet wird.

string _search="/12/";

. . .

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

Sie können Ihr SQL-Skript in Linq wie folgt schreiben:

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

Für diejenigen, die hier wie ich nach einem Weg zu einer "SQL Like" -Methode in LINQ suchen, habe ich etwas, das sehr gut funktioniert.

Ich bin in einem Fall, in dem ich die Datenbank in keiner Weise ändern kann, um die Spaltensortierung zu ändern. Also muss ich in meinem LINQ einen Weg finden, dies zu tun.

Ich benutze die Hilfsmethode SqlFunctions.PatIndex, die sich ähnlich wie der echte SQL LIKE-Operator verhält.

Zuerst muss ich alle möglichen diakritischen Zeichen (ein Wort, das ich gerade gelernt habe) im Suchwert auflisten, um Folgendes zu erhalten:

_déjà     => d[éèêëeÉÈÊËE]j[aàâäAÀÂÄ]
montreal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l
montréal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l
_

und dann in LINQ zum Beispiel:

_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();
_

Also habe ich für meine Bedürfnisse eine Helper/Extension-Methode geschrieben

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

Wenn einer von Ihnen Vorschläge zur Verbesserung dieser Methode hat, würde ich mich freuen, Sie zu hören.

0
Hugo