Как сделать оператор If в запросе Linq - PullRequest
3 голосов
/ 20 июля 2009

У меня в настоящее время есть список, который содержит следующее

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

Это сплющенный набор связанных данных (то есть, в основном, результаты объединенного поиска, которые я сохранил)

Маршрут MVC пропустит только одну строку, которую мне нужно будет сопоставить с данными на нужном уровне в иерархии. Поэтому я пытаюсь запросить CountryStr тогда, если он не дает результатов для региона, то для области; но мне нужно сделать этот бит запроса и, например ...

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

Единственный способ, которым я сейчас занимаюсь, - это запускать каждый запрос отдельно, затем проверять, какие возвращаемые значения, и использовать тот Я надеюсь, что есть более умный, более чистый метод.

Ответы [ 2 ]

4 голосов
/ 20 июля 2009

Это будет не очень легко прочитать, но вы можете сделать это за один проход, используя что-то вроде этого:

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

Также может быть легче прочитать запрос, если он слегка переписан:

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

Если мы сохраним результат сравнения, мы сможем использовать его позже. Я также добавил приведение к int?, чтобы показать, как можно использовать значение NULL, а не 0 в качестве значения «без области».

1 голос
/ 20 июля 2009

Вы не ищете оператора or? Разве это не дает желаемых результатов?

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