SubSonic如何在泛型方法中提供列名

时间:2010-09-22 21:52:38

标签: subsonic subsonic3

使用SubSonic3,我有这种通用方法(感谢linq家伙,James Curran):

    public List<T> GetFromList<T>( List<Guid> _IDs,
        Func<T, Guid> GetID,
        Func<IQueryable<T>> GetAll )
            where T : class, IActiveRecord
    {
        List<T> rc = null;
        var Results =
            from item in GetAll( )
            where ( _IDs as IEnumerable<Guid> ).Contains( GetID( item ) )
            select item;

        rc = Results.ToList<T>( );
        return rc;
    }

用类似

的方式调用它
List<Job> jresults = GetFromList( IDList,
    item => item.JobID,
    ( ) => Job.All( ) );

其中IDList是作为表的键的guid列表。

当不是通用的时候,linq看起来像这样并且完美地工作。令我印象深刻的是,SubSonic的linq提供程序可以将此代码转换为SELECT * FROM Job WHERE JobID IN(a,b,c):

            var Results =
            from item in Job.All( )
            where ( _IDs as IEnumerable<Guid> ).Contains( item.JobID )
            select item;

我希望能够使用JobID之外的其他键在除Job之外的表上调用此方法。 GetAll Func有效,因为它返回与Job.All()相同的IQueryable,但GetID抛出运行时异常,“不支持Invoke类型的LINQ表达式节点”。 GetID返回一个值,但我真正需要的是Contains(item.JobID)将识别为列名并且“where”语法可以接受的内容。 (我在这里没有显示,但我对orderby也有同样的问题。)

这可能与您对SubSonic3的了解有关吗?

1 个答案:

答案 0 :(得分:0)

我的解决方案是传递Where needed:

的表达式
 public List<T> GetFromList( List<Guid> _IDs,
    Func<IQueryable<T>> GetAll,
    Expression<Func<T, bool>> _where )
        where T : class, U, IActiveRecord
{
    List<T> rc = new List<T>( );
    if ( 0 < _IDs.Count )
    {
        if ( MAX_ITEMS > _IDs.Count )
        {
            var Results = GetAll( ).Where( _where );
            rc = Results.ToList( );
        }
        else
        {
            var Results =
                from id in _IDs
                join item in GetAll( ) on id equals item.KeyValue( )
                select item;
            rc = Results.ToList( );
        }
    }
    return rc;
}

通过

调用
  rc = GetFromList(
      IDList,
      ( ) => Job.All( ),
      ( item => ( IDList as IEnumerable<Guid> ).Contains( item.JobID ) ) );