2009-07-20 5 views
3

J'ai actuellement une liste qui contient les éléments suivantsComment faire si déclaration de requête LINQ

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

Ceci est un ensemble aplaties de données liées (donc en gros les résultats d'une recherche jointe que ive stockées)

La route MVC passera seulement une chaîne que je dois ensuite faire correspondre aux données au bon niveau dans l'heirachy. Donc j'essaie d'interroger le CountryStr alors s'il ne produit pas de résultats la région alors la région; mais je dois le faire peu de la requête et, par exemple ...

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(); 

La seule façon que je vois de faire cela au moment est en cours d'exécution chaque requête séparément puis vérifier qui a retourné des valeurs et en utilisant celle-ci. J'espère qu'il y a une méthode plus intelligente et plus propre.

Répondre

4

Il ne sera pas très facile à lire, mais vous pouvez le faire en une seule passe en utilisant quelque chose comme ceci:

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(); 

Il pourrait également être plus facile à lire la requête si elle est réécrite légèrement:

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(); 

Si nous sauvegardons le résultat de la comparaison, nous pourrons le réutiliser plus tard. J'ai également ajouté un cast à int? pour montrer comment vous pourriez utiliser une valeur Nullable au lieu d'utiliser 0 comme valeur "no Area".

+0

L'échange de null pour default (int) comme dans çağdaş semble faire à peu près ce que j'attends. Est-ce que la déclaration where indique si elle ne renvoie aucun résultat, essayez AreaStr comme je le pense? et je suppose que je pourrais facilement travailler en ajoutant plus: op –

+0

Nous supposons qu'une chaîne de région ne correspondra jamais à une chaîne de zone, donc où retournera l'élément de liste où la région correspond ou la zone allumettes. Ensuite, dans la sélection, nous vérifions à nouveau si la correspondance est une zone ou une région. Je vais éditer avec une version qui pourrait être plus facile à lire. – dahlbyk

+0

Je suis très impressionné par ce qui peut être réalisé avec cette alouette linq. joliment sucré. Merci pour votre aide! –

1

Vous ne recherchez pas l'opérateur or? Cela ne génère-t-il pas les résultats que vous voulez?

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();