我有一个使用IQueryable<FirstClass>
数据源的类/ API,但我希望公开IQueryable<SecondClass>
,其中SecondClass
是FirstClass
的包装类,几乎暴露相同的属性,但由于各种原因需要从不相关的基类继承。例如:
// My API
void IQueryable<SecondClass> GetCurrentRecords()
{
return from row in dataSource
/* Linq query */
select new SecondClass(row);
}
// User of my API
var results = GetCurrentRecords().Where(row => row.Owner = "Mike");
现在我可以使用AsQueryable
简单地进行上述编译,但是我希望公开一个“true”IQueryable
,它可以根据API用户查询有效地查询数据库。
我知道这不是微不足道的(我的包装器IQueryable实现需要理解SecondClass
和FirstClass
的属性之间的关系),并且它与{{1无关函数,但似乎就像它应该是可能的那样。
我该怎么做?
注意:我知道,我的API可能会公开Select
以及帮助方法,以便在API用户为时将FirstClass
转换为FirstClass
“完成”创建他们的查询,但感觉很乱,我不喜欢以这种方式暴露我生成的类的想法。另外,我想知道如何从纯粹的学术角度来做上述事情。
答案 0 :(得分:0)
可能你不应该返回IQueriable,而是Expression。然后,您将能够修改表达式,让LINQ从最终的Expression对象生成查询。示例如下:http://msdn.microsoft.com/en-us/library/bb882637.aspx