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