verwendetes Datenbanksystem: EF Code First & MS SQL 2005
Hi,
ich habe ein Problem mit dem Kombinieren von zwei Where Bedingungen und ich weiß nicht warum!
Ich habe eine IQueryable die mir als Basis dient und dann möchte ich zu dieser Where Bedingungen dynamisch hinzufügen.
Das komische ist, wenn ich nur eine Bedingung hinzufüge funktioniert das prima, aber sobald die zweite dazu kommt, bekomme ich kein Ergebnis mehr zurück.
Beide Bedingungen die ich kombinieren möchte, funktionieren für sich alleine!
Hier, was ich mache:
// Alle Filter aus dem Grid anwenden
foreach (var loopFilter in gridParameter.Filter)
{
if (loopFilter.Key == "Betreff")
{
baseQuery = baseQuery.Where(a => a.Betreff.Contains(loopFilter.Value));
}
else if (loopFilter.Key == "GesendetAn")
{
baseQuery = baseQuery.Where(a => a.GesendetAnUsername.Contains(loopFilter.Value));
}
else if (loopFilter.Key == "Kundenname")
{
baseQuery = baseQuery.Where(a => a.Kunde.Name.Contains(loopFilter.Value));
}
else if (loopFilter.Key == "Status")
{
var val = Convert.ToBoolean(loopFilter.Value);
baseQuery = baseQuery.Where(a => a.IstErledigt == val);
}
}
baseQuery ist die IQueryable.
Habt ihr irgendwelche Ideen?
Grüße
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Dir ist bewusst, dass du die Where-Bedingungen UND-verknüpfst? Denn das kann ja schon dazu führen, dass du keine Ergebnisse mehr bekommst.
Ansonsten: Was sagt denn der SQL Server Profiler welches Statement ausgeführt wurde?
Hallo,
da bist du wohl in die Closure-Falle getappt, s.a. [Artikel] Delegaten, anonyme Methoden, Lambda-Ausdrücke & Co. (s. "Anonyme Methoden unter der Haube" ff.)
Erstelle innerhalb der foreach-Schleife eine lokale Variable:
foreach (var loopFilter in gridParameter.Filter)
{
string filterValue = loopFilter.Value;
if (loopFilter.Key == "Betreff")
{
baseQuery = baseQuery.Where(a => a.Betreff.Contains(filterValue));
}
// ...
}
Edit: Oder dN!3L, täusche ich mich?
@ dN!3L
Ja, ich weiß das sie AND verknüpft werden und genau das möchte ich auch.
Wo finde ich denn diesen "SQL Server Profiler"?
Hallo Th69,
nein die täuscht dich nicht. Die Closures kommen noch hinzu. Umso eher ist der PredicateBuilder geeignet.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
@Th69
Hey super, dank deinem Tip funktionierts!!!
Werde mir jetzt mal deinen Artikel zu Gemüte führen und schauen was das für eine Falle ist! 😃
Danke an alle!
Edit: Oder dN!3L, täusche ich mich?
Ui, gutes Auge. Stimmt, die Iterator-Variable in der anonymen Methode verwendet. Die fiese Closure-Falle...
Wo finde ich denn diesen "SQL Server Profiler"
Kommt drauf an, welche SQL-Server Edition du installiert hast (im Express gibt's den Profiler nicht). Im Startmenü sollte im MS SQL-Ordner ein Eintrag "SQL Server Profiler" auftauchen.
Da würde man dann auch sehen, dass nicht die erwarteten Werte als Filter benutzt wurden.
Hm, kann man dem EF-Context nicht dazu überreden, die SQL-Befehle mit auszugeben? Der LINQ2SQL-Context kann das...
Hallo,
für SQL Express z.B. mit dem AnjLab SQL Profiler.
kann man dem EF-Context nicht dazu überreden, die SQL-Befehle mit auszugeben?
Bei weitem nciht so elegant wie bei Linq2Sql. Das wundert mich auch immer warum das so ist. Aber im VS Ultimate mit IntelliTrace werden die Statements aufgezeichnet. Ohne Ultimate gehts irgendwie - Suchstichwort z.B.: EF + Tracing -> Tracing SQL Statements generated by Entity Framework
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"