“linq where”不能解析属性吗?

时间:2010-06-17 22:41:54

标签: c#

我有一个IQueryable(PartHistories)将返回一组对象。我有一个名为Phase的枚举,它改变了查询,就像这样(rc是一个列表):

            var query = this.PartHistories;
            if ( Phase.Repair == _Phase )
            {
                query = query.Where( ph => ph.RemovedInRepair == false );
            }
            else
            {
                query = query.Where( ph => ph.PartPhaseID != ( int )Phase.Repair );
            }
            rc.AddRange( query
                .ToList( ) );

这很有效。

现在,有问题的对象(PartHistory)有一个属性PartPhase,它将PartPhaseID强制转换为Phase。但是,此代码不起作用(更改位于Phase.Repair行中):

            var query = this.PartHistories;
            if ( Phase.Repair == _Phase )
            {
                query = query.Where( ph => ph.RemovedInRepair == false );
            }
            else
            {
                query = query.Where( ph => ph.PartPhase != Phase.Repair );
            }
            rc.AddRange( query
                .ToList( ) );

在AddRange中,例外情况是“不支持成员'PartPhase'。

最后,以下代码有效,但在这种情况下,Where是List的扩展名,并且(我认为)适用于所有PartHistories被收集后:

          if( Phase.Repair == _Phase )
          {
              rc.AddRange( this.PartHistories.ToList( )
                  .Where( ph => ph.RemovedInRepair == false ) );
          }
          else
          {
              rc.AddRange( this.PartHistories.ToList( )
                  .Where( ph => ph.PartPhase != Phase.Repair ) );

1 个答案:

答案 0 :(得分:2)

如果这是Linq to SQL,那么是的,它不支持自定义方法调用。 它可以将表达式转换为SQL查询,但不知道您的属性中发生了什么。因此,自定义方法和属性不能转换为SQL。

如果你可以制作一个Expression<Func<PartHistory, PartPhase>>,它可以做同样的事情(不调用自定义方法),那么它就可以了。