SubSonic Как предоставить имя столбца в универсальном методе - PullRequest
0 голосов
/ 23 сентября 2010

Используя SubSonic3, у меня есть этот универсальный метод (благодаря Линку, Джеймсу Куррану):

    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 является спискомнаправляющих, которые являются ключами к столу.

Когда не универсальный, linq выглядит так и работает отлично.Я был очень впечатлен тем, что поставщик LinQ от SubSonic может взять этот код и превратить его в SELECT * FROM Job WHERE IN JobID (a, b, c):

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

Я хочу иметь возможность вызывать этот метод натаблицы, отличные от Job, с ключами, отличными от JobID.Функция GetAll работает, потому что она возвращает тот же IQueryable, что и Job.All (), но GetID генерирует исключительную ситуацию во время выполнения: «Узел выражения LINQ типа Invoke не поддерживается».GetID возвращает значение, но что мне действительно нужно от него - это то, что Contains (item.JobID) распознает как имя столбца и что синтаксис «где» примет.(Я не показываю это здесь, но у меня та же проблема с orderby.)

Возможно ли это с тем, что вы знаете о SubSonic3?

1 Ответ

0 голосов
/ 24 сентября 2010

Мое решение состояло в том, чтобы передать выражение Где необходимо:

 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 ) ) );
...