在linq.Where或.OrderBy中推广列名

时间:2010-09-22 14:10:21

标签: linq generics

我有一个包含许多子类的“经理”课程。我发现一个特定的方法在所有或几乎所有子类中都是重复的,所以我想概括它。在一个案例中,它看起来像这样:

                        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;
    }

2 个答案:

答案 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 ) ) );