2016-10-17 2 views
-2

Ich verliere es ... = \C# String.Compare in FirstOrDefault von Entity Framework

Mit .NET Framework 4 Entity Framework verwenden, um MS SQL DB

(JFYI zu bekommen - hier einige hässliche suchen Code Wie es sich für einen lokalen Dienst ist und nicht immer mit Tabellen größer als ~ 1000 Zeilen arbeiten -. der Werkzeugsatz gewählt hat, ist mehr oder weniger akzeptabel)

Ausführen des nächsten Code

var itemOfInterest = entity.tbl_Items 
          .FirstOrDefault(item => 
           string.Compare(item.Name, SomeLocalItem.Name, true) == 0 
          && (string.Compare(item.tbl_Server.FQDN, SomeLocalItem.ServerFQDN, true) == 0) 
          || (string.Compare(item.Server.FQDN, WithoutDomainLocalFQDN, true) == 0) 
          ); 
.

und es gibt mir die ersten (oder null) Artikel, gefunden gerade von der

(string.Compare(item.tbl_Server.FQDN, SomeLocalItem.ServerFQDN, true) == 0) 
|| (string.Compare(item.Server.FQDN, WithoutDomainLocalFQDN, true) == 0) 

Ursache

Wenn

läuft
var serviceOfInterest = entity.tbl_Service 
           .Where(item => string.Compare(item.Name, SomeLocalItem.Name, true) == 0) 
           .FirstOrDefault(item => 
            (string.Compare(item.tbl_Server.FQDN, SomeLocalItem.ServerFQDN, true) == 0) 
           || (string.Compare(item.Server.FQDN, WithoutDomainLocalFQDN, true) == 0) 
           ); 

Ich bin immer das richtige Ergebnis.

Ich fühle mich nicht gut. Vielleicht ist das Problem hier wirklich sehr einfach, aber ich kann es nicht einfach sehen. Die Strings verglichen in Artikel Namen sehen in etwa so aus:

"Mein Awesome Item - Stift."

"My Awesome Item - Grand-pas gun"

"My Awesome Gegenstand - etwas in der Tasche - für Sie"

jede Hilfe dankbar. Ich bin sogar OK damit, mich für eine solche Frage Namen zu nennen, aber ich brauche wirklich wirklich die Antwort.

Vielen Dank im Voraus.

+1

Verwenden Sie string.Compare == 0 für die Gleichstellung zu überprüfen? Ich glaube, dass das Vergleichen von Strings mit dem ==-Operator von Entity Framework besser verstanden wird, da es dem Framework ermöglicht, Abfragen zu erstellen, indem das aus dem Lambda erstellte Ausdrucksbaumobjekt analysiert wird. Operator Vorrang kann auch das Problem sein. Wenn die erste Abfrage als (a && b) || ausgewertet wird c Es wird nicht die gleichen Ergebnisse wie die letzte Abfrage zurückgeben, die effektiv ein && (b || c) ist. –

Antwort

2

die Sie interessieren,

var itemOfInterest = entity.tbl_Items.FirstOrDefault(item => string.Compare(item.Name, SomeLocalItem.Name, true) == 0 && ((string.Compare(item.tbl_Server.FQDN, SomeLocalItem.ServerFQDN, true) == 0) || (string.Compare(item.Server.FQDN, WithoutDomainLocalFQDN, true) == 0))); 
+0

Sie müssen mich verarschen ... Danke! Sorry Leute für die dumme Frage. Es macht mir nichts aus, wenn es von Administratoren gelöscht wird. – Vital