2011-11-04 88 views
2

我编辑我的代码,以前只是需要帮助合并两个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>(); 

如何合并这两个一起

回答

3

使用ConcatUnion方法。

样品:

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

我tryed把第二个查询中.union 但它一直得到错误 –

+0

@bugz,提供“错误”,你的类。 –

+0

编辑你的问题,并告诉我们你是如何做'联合'和你得到什么错误消息。 – Jacob

1

不知道其中哪些你的意思。首先是如果你想进一步限制名单,第二名如果你想扩大它。

from p in phrases 
where p.Service.Code == par.Service.Code && 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) 
+0

+1听起来好像他们所要求的或给我。 – Craig

+1

我会怀疑,如果'ParPhase'的类型为'ParTypePhase',试图调用'par.Service.Code'会引起问题。 – pstrjds

0

这里是组合查询:

return phases.OfType<ServicePhase>() 
.Where(p => 
{ 
    bool tmpResult = p.Service.Code == par.Service.Code; 
    if(tmpResult && p is ParTypePhase) 
    { 
     tmpResult = (p as ParTypePhase).ParType.Code == par.Type.Code; 
    } 
    return tmpResult; 
}).Cast<ParPhase>() 
2
return phases 
      .Where(p => ((p is ServicePhase) && (p as ServicePhase).Service.Code == par.Service.Code) || 
         ((p is ParTypePhase) && (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 && NeverGoingToGetCalled() 

因为错误而且任何东西总是错误的。如果您想了解更多关于它的信息,那就叫short-circuit evaluation