2017-08-24 2 views
5

I identifiziert haben, dass, wenn der folgende Ausdruck ausgeführt:Entity Framework fügt eine zusätzliche Bedingung, wo Klausel

int aNum = 52; 
var myArtifacts = mydbcontext.artifacts.Where(a => a.ParentID == aNum).ToList(); 

auf mysql die Abfrage ausgeführt wird:

SELECT 
    `Extent1`.`ID`, 
    `Extent1`.`ParentID` 
FROM `artifacts` AS `Extent1` 
WHERE ((`Extent1`.`ParentID` = 52) AND (52 IS NOT NULL)); 

Kann jemand bitte erklären, warum diese Letzte Extra-Bedingung hinzugefügt?

UND (52 IS NOT NULL))

+3

Hmm, ich habe dies für Parameter gesehen, aber nicht für Konstanten. Versuchen Sie, 'DbContext.Configuration.UseDatabaseNullSemantics' auf' true' zu ​​setzen. –

+0

Eigentlich war es ein Parameter, sorry. Ich gebe einfach eine Zahl ein, um es einfacher zu machen – cnom

+0

Was ist der Datentyp des Parameters? – DavidG

Antwort

1

prüfen https://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbcontextconfiguration.usedatabasenullsemantics(v=vs.113).aspx

Ruft einen Wert ab, der angibt, ob Datenbank null Semantik ausgestellt werden, wenn zwei Operanden zu vergleichen, von denen beide möglicherweise sind NULL-fähig. Der Standardwert ist false. Zum Beispiel (operand1 == operand2) wird wie folgt übersetzt: (operand1 = operand2) wenn UseDatabaseNullSemantics wahr ist (((operand1 = operand2) AND (NOT (operand1 IST NULL ODER operand2 IST NULL))) ODER ((operand1 IS NULL) UND (operand2 ist NULL))) wenn UseDatabaseNullSemantics false ist.

Wenn das aktuelle Verhalten, das Sie stört, sollten Sie UseDatabaseNullSemantics zu true Einstellung.

public class MyContext : DbContext 
{ 
    public MyContext() 
    { 
     this.Configuration.UseDatabaseNullSemantics = true; 
    } 
} 

oder

myDbContext.Configuration.UseDatabaseNullSemantics = true; 
+0

Nein, eigentlich stört mich das Verhalten nicht. Soweit ich weiß, bringt es keine zusätzliche Verarbeitungszeit (zumindest nicht bemerkenswert). Würden Sie einen Grund vorschlagen, den ich ändern sollte? Meine erste Frage war im Grunde aus Neugierde – cnom

+0

Ich nehme an, dass es nur eine Frage der Präferenz ist, wenn Sie auf die Null-Semantik der Datenbank verlassen wollen oder nicht. Es wird empfohlen, die Standardwerte einzuhalten, es sei denn, Sie haben einen guten Grund, dies nicht zu tun. –

+0

Ihre Antwort wird wahrscheinlich akzeptiert, aber wie ich spezifiziert habe, ist in meinem Fall der eine Operand nicht "potentiell nullbar", also erklärt er nicht die gegebene Situation. – cnom

Verwandte Themen