2011-04-09 82 views
0

ODS列表是为分页/排序对象数据源实现筛选选择方法的抽象类的集合。我已经定义了代表过滤器,返回的数据和产生这些结果的三种方法absract类:抽象类的重写属性

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

} 

我实现击中一个问题,当我尝试了listData转换为显式返回的数据。

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

诊断我打是:

无法转换类型的对象 'System.Data.Linq.DataQuery 1[BusinessLayer.EmployeeData]' to type 'System.Linq.IQueryable 1 [ODSList.ListData]'。

回答

0

?如果您的版本早于4.0,那么泛型接口中指定的类型是不变的,这意味着您不能从IQueryable转换为IQueryable。

查看MSDN文章here

编辑:后有点实验和发现this SO post的,我发现,像下面应该为你工作:

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>(); 
} 
+0

这可能是解决方案。我在4.0 @ work和3.5 @ home(我正在写这篇文章)。我将在星期一进行测试。 – 2011-04-10 04:05:26

+0

对不起,我花了这么长时间才确认这一点,但您的解决方案奏效了。 – 2011-04-27 18:30:31

0

您可以尝试

return allrows.AsQueryable(); 

,我不知道,但你可能需要您正在使用什么版本的.NET做

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 
+0

AsQueryable已()没有解决问题。 ListData只是一个必须被覆盖的空抽象类。这是铸造似乎是问题的覆盖 – 2011-04-10 00:43:37