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语句,如果你的接口对象并不在数据库中,则一定会报错