Laden...

Kombinieren von zwei funktionierenden Abfragen, funktioniert nicht ;(

Erstellt von Curse4Life vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.185 Views
C
Curse4Life Themenstarter:in
452 Beiträge seit 2005
vor 12 Jahren
Kombinieren von zwei funktionierenden Abfragen, funktioniert nicht ;(

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

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Curse4Life,

ev. ist der PredicateBuilder was für dich.

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!"

2.891 Beiträge seit 2004
vor 12 Jahren

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?

4.940 Beiträge seit 2008
vor 12 Jahren

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?

C
Curse4Life Themenstarter:in
452 Beiträge seit 2005
vor 12 Jahren

@ 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"?

6.911 Beiträge seit 2009
vor 12 Jahren

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!"

C
Curse4Life Themenstarter:in
452 Beiträge seit 2005
vor 12 Jahren

@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!

2.891 Beiträge seit 2004
vor 12 Jahren

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...

6.911 Beiträge seit 2009
vor 12 Jahren

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!"