2009-07-20 14 views
3

ich zur Zeit folgende If-Anweisung tun, um eine Liste, die enthält dieWie in Linq Abfrage

CountryCode (string) 
CountryStr (string) 
RegionStr (string) 
RegionID (int) 
AreaStr  (string) 
AreaID  (int) 

Dies ist eine abgeflachte Satz von verknüpften Daten (also im Grunde die Ergebnisse einer verbundenen Suche, die gespeichert ive)

Die MVC-Route wird nur eine Zeichenfolge übergeben, die ich dann mit den Daten auf der rechten Ebene in der Heirachy übereinstimmen muss. Also versuche ich den CountryStr abzufragen, wenn es dann nicht die Region und dann den Bereich produziert; aber ich brauche, dass etwas der Abfrage zu tun und zum Beispiel ...

var datURL = (from xs in myList 
       //query 1 
       where xs.RegionStr == rarREF 
       select new 
       { 
       regionID = xs.RegionId, 
       CountryID = xs.CountryCd 
       } 
       //IF theres no results 
       where xs.AreaStr == rarREF 
       select new 
       { 
       AreaID = xs.AreaID 
       regionID = xs.RegionId, 
       CountryID = xs.CountryCd 
       }    
       ).ToList(); 

Der einzige Weg, ich sehe das im Moment zu tun, jede Abfrage separat ausgeführt wird dann überprüft, welche Werte zurückgegeben und die Verwendung dieser ein. Ich hoffe, es gibt eine cleverere, sauberere Methode.

Antwort

4

Es wird nicht sehr leicht zu lesen, aber man kann dies so etwas wie dies in einem einzigen Durchgang tun mit:

var datURL = (from xs in myList 
       where xs.RegionStr == rarREF || xs.AreaStr == rarREF 
       select new 
       { 
       AreaID = (xs.AreaStr == rarRef ? xs.AreaID : default(int)), 
       RegionID = xs.RegionId, 
       CountryID = xs.CountryId 
       } 
      ).ToList(); 

Es könnte auch einfacher sein, die Abfrage zu lesen, wenn es neu geschrieben ist leicht:

var datURL = (from xs in myList 
       let isArea = xs.AreaStr == rarREF 
       let isRegion = xs.RegionStr == rarREF 
       where isRegion || isArea 
       select new 
       { 
       AreaID = (isArea ? (int?)xs.AreaID : null), 
       RegionID = xs.RegionId, 
       CountryID = xs.CountryId 
       } 
      ).ToList(); 

Wenn wir das Vergleichsergebnis speichern, können wir es später wiederverwenden. Ich fügte auch eine Umwandlung zu int? hinzu, um zu zeigen, wie Sie einen nullbaren Wert verwenden konnten, anstatt 0 als Ihren "no Area" Wert zu verwenden.

+0

Austauschen von Null für Standard (Int) wie in çağdaş scheint zu tun, was ich erwarte. Also ist die Wo Aussage sagen, wenn es keine Ergebnisse zurückgibt versuchen Sie AreaStr, wie ich denke, es ist? und damit vermute ich, dass ich mich problemlos mit mehr hinzufügen könnte: op –

+0

Wir gehen davon aus, dass eine Region-Zeichenkette niemals einer Area-Zeichenkette entsprechen wird. Daher gibt die Where entweder das Listenelement zurück, wo die Region übereinstimmt oder die Area Streichhölzer. Dann in der Auswahl überprüfen wir erneut, ob die Übereinstimmung ein Bereich oder eine Region ist. Ich werde mit einer Version bearbeiten, die leichter zu lesen ist. – dahlbyk

+0

Ich bin ziemlich beeindruckt von dem, was mit dieser linq Lerche erreicht werden kann. verdammt süß. Danke für die Hilfe! –

1

Sind Sie nicht auf der Suche nach or Betreiber? Erzeugt das nicht die gewünschten Ergebnisse?

var datURL = (from xs in myList 
       where xs.RegionStr == rarREF || xs.AreaStr == rarREF 
       select new 
       { 
       AreaID = xs.AreaStr == rarREF ? xs.AreaID : default(int) 
       regionID = xs.RegionId, 
       CountryID = xs.CountryCd 
       }).ToList();