2011-04-09 78 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