Нужна помощь в объединении двух инструкций LINQ

#c# #.net #linq

#c# #.net #linq

Вопрос:

Я редактирую свой код, который раньше был просто

      return phases
            .OfType<ServicePhase>()
            .Where(p => p.Service.Code == par.Service.Code)
            .Cast<ParPhase>()
  

однако теперь я хочу, чтобы он включал оба

  return phases
                .OfType<ServicePhase>()
                .Where(p => p.Service.Code == par.Service.Code)
                .Cast<ParPhase>()

             .OfType<ParTypePhase>()
            .Where(p => p.ParType.Code == par.Type.Code)
            .Cast<ParPhase>();
  

Как я могу объединить их оба вместе

Ответ №1:

Используйте метод Concat или Union .

Образец:

 var result = 
    phases
        .OfType<ServicePhase>()
        .Where(p => p.Service.Code == par.Service.Code)
        .Cast<ParPhase>()
        .Union(
            phases.OfType<ParTypePhase>()
            .Where(p => p.ParType.Code == par.Type.Code)
            .Cast<ParPhase>()
         );
  

Комментарии:

1. я попытался ввести второй запрос в .union<запрос 2>, но он продолжает получать ошибки

2. Отредактируйте свой вопрос и покажите нам, как вы пытаетесь сделать Union и какое сообщение об ошибке вы получаете.

Ответ №2:

 return phases
            .Where(p => ((p is ServicePhase) amp;amp; (p as ServicePhase).Service.Code == par.Service.Code) || 
                        ((p is ParTypePhase) amp;amp; (p as ParTypePhase).ParType.Code == par.Type.Code))
            .Cast<ParPhase>()
  

Это работает, потому что, если p не является ServicePhase , эта строка, (p as ServicePhase).Service.Code которая была бы object reference not set to an instance of an object , никогда не вычисляется.

 false amp;amp; NeverGoingToGetCalled()
  

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

Ответ №3:

Не уверен, какой из них вы имеете в виду. Первый — если вы хотите еще больше ограничить список, второй — если вы хотите его расширить.

 from p in phrases
where p.Service.Code == par.Service.Code amp;amp; p.ParType.Code == par.Type.Code
select new ParPhase(p)
  

или

 from p in phrases
where p.Service.Code == par.Service.Code || p.ParType.Code == par.Type.Code
select new ParPhase(p)
  

Комментарии:

1. Я бы заподозрил, что если ParPhase тип ParTypePhase , который пытается вызвать par.Service.Code , вызовет проблемы.

Ответ №4:

Это может быть проще, если подумать о шаблоне спецификации:http://en.wikipedia.org/wiki/Specification_pattern

Ответ №5:

Вот объединенный запрос:

 return phases.OfType<ServicePhase>()
.Where(p => 
{
  bool tmpResult = p.Service.Code == par.Service.Code;
  if(tmpResult amp;amp; p is ParTypePhase)
  {
      tmpResult = (p as ParTypePhase).ParType.Code == par.Type.Code;
  }
  return tmpResu<
}).Cast<ParPhase>()