LINQ union с необязательным нулевым вторым параметром - PullRequest
5 голосов
/ 28 февраля 2011

У меня есть два запроса, которые возвращают коллекцию объектов одного типа, после того, как эти два запроса выполнены, я хочу объединить их.

var results = from t in All()
              where t.Blah.Contains(blahblah)
              select t;

var results2 = from t in All()
               where t.blah2.contains(blahblah)
               select t;

return results.Union(results2);

Возможно , что второй запрос не может дать результатов, и будет null.

Похоже, если я попытаюсь выполнить объединение с двумя, если второй аргумент будет нулевым, он выдаст ArgumentNullException.

Очевидным ответом будет просто выполнить .ToList() во втором запросе, чтобы увидеть, содержит ли он что-нибудь.Проблема в том, что я пытаюсь воспользоваться отложенным выполнением и не хочу на самом деле выполнять запрос к базе данных на этом этапе.

Есть ли способ обойти это?

Правка - Решение

var results2 = from t in All()
        where t.blah2!=null && t.blah2.Contains(blahblah)
        select t;

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

Спасибо за помощь!

Ответы [ 3 ]

6 голосов
/ 28 февраля 2011

results2 должен возвращать пустой список, а не null при выполнении запроса. Код, который у вас есть, не должен вызывать каких-либо проблем и должен прекрасно работать во всех простых случаях, которые я могу себе представить. Можете ли вы предоставить информацию, которая может вызвать проблему, которую вы пытаетесь решить?

4 голосов
/ 28 февраля 2011

Не поможет ли следующее решить вашу проблему?

return from t in All()
       where t.Blah.Contains(blahblah) && t.Blah2.Contains(blahblah)
       select t;

Однако, если results и results2 необходимо разделить и вы хотите объединить их:

return results.Union(results2 ?? Enumerable.Empty<TResult>());
0 голосов
/ 28 февраля 2011
var results = from t in All()
           where t.Blah.Contains(blahblah)
            select t;

var results2 = from t in All()
           where t.blah2.contains(blahblah)
             select t;

return (results2 != null || results2.Count() > 0) ? results.Union(results2) : results;

Это либо вернет объединение, если в результатах2 что-то есть, либо просто вернет первый набор результатов.

...