[英]Overriding properties of abstract class
ODS List是抽象類的集合,這些抽象類為分頁/排序的對象數據源實現過濾的選擇方法。 我定義了三個抽象類,分別代表過濾器,返回的數據和產生這些結果的方法:
[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[BusinessLayer.EmployeeData]' to type 'System.Linq.IQueryable
1 [ODSList.ListData]”的對象。
你可以試試
return allrows.AsQueryable();
我不確定,但您可能需要做
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
您正在使用哪個版本的.Net? 如果您使用的版本早於4.0,則通用接口中指定的類型是不變的,這意味着您無法從IQueryable轉換為IQueryable。
在此處查看MSDN文章。
編輯:經過一些試驗並找到了此SO帖子 ,我發現類似以下內容的內容應該對您有用:
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>();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.