日期:2014-05-20  浏览次数:20719 次

linq 查询接口对象
直接上伪代码:
public interface IPerson
{
     DateTime Birthday {get;set;}
}
 学生,老师,家长,其他人 : IPerson

现想写个方法做过滤
public IQueryable<T> Filter<T>(IQueryable<T> queryData)
{
     return queryData.Where(item => (item as IPerson).Birthday < System.DateTime.Now);
}

会报错.....求高手解答.
目前知道有一种可以通过附加Expression的做法(调用 Expression.Call实现)

------解决方案--------------------
引用:
to silentcross:
   忘记了,好像是说 不能用 TypeAs 之类 的.   IQueryable<T>.where()返回的是IQueryable<T>
   用EF4.1 连接的是sql2008

那说的应该是 (item as IPerson).Birthday 这里有问题,改成((IPerson)item).Birthday试试

------解决方案--------------------
return queryData.OfType<IPerson>().Where(item => item .Birthday < System.DateTime.Now);
------解决方案--------------------
http://msdn.microsoft.com/zh-cn/library/vstudio/bb360913.aspx

Return Value
Type: System.Collections.Generic.IEnumerable<TResult>
An IEnumerable<T> that contains elements from the input sequence of type TResult.
------解决方案--------------------
当你使用linq 进行查询时,分两种情况:
1.查询内存对象。此时,你的查询应是会成功的。

2.查询数据库持久化对象。
此时,你的查询一定会失败。

因为直接查询数据库时,会转换成sql语句,如果你的接口对象并不在数据库中,则一定会报错