Используя 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?