需要帮助合并两个LINQ语句

时间:2011-11-04 17:49:41

标签: 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>();

我如何将这两者合并在一起

5 个答案:

答案 0 :(得分: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>()
         );

答案 1 :(得分: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

答案 2 :(得分: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)

答案 3 :(得分:1)

如果考虑规范模式:http://en.wikipedia.org/wiki/Specification_pattern

,可能会更容易

答案 4 :(得分: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>()