ODS List is an accumulation of abstract classes that implement a strained choose way of a paged/sorted object datasource. I've defined three absract classes that represent the filter, the came back data and also the techniques that produce these results:

[Serializable]
public abstract class ListFilter
{
    //  Define filter properties
}

[Serializable]
public abstract class ListData
{
    //  Define properties to be returned from the query
}
public abstract class ListMethods
{
    public int ListCount(ListFilter filter)
    {
        var rows = listQuery();
        rows = listFilter(rows, filter);
        return rows.Count();
    }

    /// <summary>
    /// List returns a page of data 
    /// </summary>
    /// <param name="filter"></param>
    /// <param name="sortType"></param>
    /// <param name="startRowIndex"></param>
    /// <param name="maximumRows"></param>
    /// <returns></returns>
    public IEnumerable<ListData> List(ListFilter filter, string sortType, int startRowIndex, int maximumRows)
    {
        var rows = listQuery();
        rows = listFilter(rows, filter);
        rows = listSort(rows, sortType);
        return rows.Distinct().Skip(startRowIndex).Take(maximumRows).ToList();
    }

    public abstract IQueryable<ListData> listQuery();

    public virtual IQueryable<ListData> listFilter(IQueryable<ListData> rows, ListFilter filter)
    {
        return rows;
    }

    public virtual IQueryable<ListData> listSort(IQueryable<ListData> rows, string sortType)
    {
        bool sortDescending = false;
        if (!string.IsNullOrEmpty(sortType))
        {
            string[] values = sortType.Split(' ');
            sortType = values[0];
            if (values.Length > 1)
            {
                sortDescending = values[1] == "DESC";
            }
        }


        if (!string.IsNullOrEmpty(sortType))
        {
            if (sortDescending)
            {
                rows = rows.OrderBy(sortType + " DESC");
            }
            else
            {
                rows = rows.OrderBy(sortType);
            }
        }

        return rows;
    }

}

My implementation hits an issue after i attempt to cast the ListData towards the explicit came back data.

[Serializable]
public class EmployeeData : ODSList.ListData
{
    public int EmployeeId { get; set; }
    public int? ReportsToId { get; set; }...
}

    public override IQueryable<ListData> listQuery()
    {
        var dc = new NorthwindDataContext();
        var allrows = from emp in dc.Employees
                    select new EmployeeData()
                    {
                        EmployeeId = emp.EmployeeID,
                        ReportsToId = emp.ReportsTo, ...
                    };
        return (IQueryable<ListData>)allrows; <-- PROBLEM ENCOUNTERED HERE
    }

The diagnostic I hit is:

Not able to cast object of type 'System.Data.Linq.DataQuery1[BusinessLayer.EmployeeData]' to type 'System.Linq.IQueryable1[ODSList.ListData]'.

You can test

return allrows.AsQueryable();

and I am unsure but you may want to do

return allrows.Cast<ListData>().AsQueryable(); // if EmployeeData inherits from ListData; it is not required.
                                               // but i'm not sure if ListData is the same as ODSList.ListData

What version of .Internet are you currently using? If you are on the version sooner than 4. the kinds specified by a normal interface are invariant, meaning you cannot cast from IQueryable to IQueryable.

Browse the MSDN article here.

edit: After a little of experimentation and finding this SO post, I discovered that something similar to the next should meet your needs:

public override IQueryable<ListData> listQuery()
{
    var dc = new NorthwindDataContext();
    var allrows = from emp in dc.Employees
                select new EmployeeData()
                {
                    EmployeeId = emp.EmployeeID,
                    ReportsToId = emp.ReportsTo, ...
                } as ListData;
    return allrows.OfType<ListData>();
}