2017-09-21 3 views
7

Ich habe eine Tabelle, die ein String-Feld enthält, das Hostnamen enthält. Sie sind meist voll qualifizierte Domainnamen, aber im Laufe der Jahre haben sich die Domain-Bits nach dem ersten "Punkt" geändert, da verschiedene DNS-Änderungen auf uns gefallen sind. So könnte ich die Maschine „tom“, die in der Tabelle ist als:C# Linq string Vergleich mit indexOf

tom.company.com 
tom.it.company.com 
tom.newComapnyBranding.com 
... 

Ich habe oft Vergleiche tun gegen den „aktuellen“ Host-Namen und dieser historischen Speicher. Doing so etwas wie:

WHERE 
    UPPER(SUBSTRING(@foo, 1, CHARINDEX(".", @foo))) = 
    UPPER(SUBSTRING(myDB.myTable.machineName, 1, CHARINDEX(".", myDB.myTable.machineName))) 

Ok, ich versuche, eine davon in eine Linq-Abfrage zu konvertieren, sondern auf dem „Index“ Teil bin Stolpern. Ich bin so nah gekommen wie:

myTable.machineName.ToUpper().Substring(0, myTable.machineName.IndexOf(".")) 
    .Equals(foo.ToUpper().Substring(0, foo.IndexOf("."))) 

aber Visual Studio beschwert sich über "IndexOf". Sie behauptet, dass ich die IndexOf ändern müssen:

IndexOf(".", StringComparison.Ordinal)) 

, aber wenn ich es laufen bekomme ich die Ausnahmemeldung:

LINQ to Entities does not recognize the method 'Int32 IndexOf(System.String, 
System.StringComparison)' method, and this method cannot be translated into 
a store expression 

Wie machen Sie diese Art von indiziert basierend Teilzeichenfolge in Linq?

+1

Auf Ihrer Follow-on-Frage, bitte an eine neue Frage bewegen, jede Frage erlaubt, unabhängig zu sein und mit einem klaren und bestimmten Thema, so dass andere Personen mit der das gleiche Problem (individuell), um die Lösungen zu erreichen. –

Antwort

7

Ausdrücke, die Entity Framework zugewiesen werden, sind auf solche beschränkt, die in SQL übersetzt werden können. EF kann nicht String.IndexOf in SQL übersetzen.

Sie stattdessen SqlFunctions.CharIndex verwenden können:

SqlFunctions.CharIndex(machineName, ".") 
+0

danke. wusste nie vorher etwas über die SqlFunktionen. –