我有一个包含许多子类的“经理”课程。我发现一个特定的方法在所有或几乎所有子类中都是重复的,所以我想概括它。在一个案例中,它看起来像这样:
var Results =
from j in Job.All( )
where guids.Contains( j.JobID )
orderby j.JobNumber
select j;
我正在使用SubSonic,因此Job.All()是一个返回IQueryable<Job>
的静态方法。 guids是一个IEnumerable<Guid>
,它将一个键列表保存在Job表中。我的最终结果是一个带有WHERE Job.JobID IN(x,y,z)的SQL查询。
我正在寻找一种方法来调用这样的方法,我传入guid,“Job”,“JobID”和“JobNumber”,以便我可以将它们插入适当的位置。
SQL IN子句可以处理的参数数量有限制,因此我的常规方法还会检查guids.Count,并在超过一定数量(例如2000)时编码一些不同的查询。此代码也在所有子类中。
注意:我不反对使用lambda样式表示法。这是我的第一个剪辑,它有“T.All()”和item。???:
的问题 const int MAX_ITEMS = 2000;
public List<T> GetFromList<T>( List<Guid> _IDs )
where T : class, IActiveRecord
{
List<T> rc;
if ( MAX_ITEMS > _IDs.Count )
{
var Results =
from item in T.All( )
where _IDs.Contains( item.??? )
orderby item.???
select item;
rc = Results.ToList<T>( );
}
else // too many for IN clause
{
var Results =
from id in _IDs
join item in T.All( ) on id equals item.???
orderby item.???
select item;
rc = Results.ToList<T>( );
}
return rc;
}
答案 0 :(得分:1)
const int MAX_ITEMS = 2000;
public List<T> GetFromList<T>( List<Guid> _IDs, T _db,
Expression<Func<T, Guid>> GetID,
Expression<Func<IQueryable<T>> GetAll )
where T : class, IActiveRecord
{
List<T> rc;
if ( MAX_ITEMS > _IDs.Count )
{
var Results =
from item in GetAll( )
where _IDs.Contains( GetID(item))
orderby GetID(item)
select item;
rc = Results.ToList<T>( );
}
else // too many for IN clause
{
var Results =
from id in _IDs
join item in T.All( ) on id equals GetID(item)
orderby GetID(item)
select item;
rc = Results.ToList<T>( );
}
return rc;
}
呼叫:
GetFromList(ids, db, item=>item.JobID, ()=> Job.All());
答案 1 :(得分: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 ) ) );