“选择”或“包装”IQueryable以使其仍然可查询

时间:2011-03-31 00:10:32

标签: c# .net linq linq-to-entities iqueryable

我有一个使用IQueryable<FirstClass>数据源的类/ API,但我希望公开IQueryable<SecondClass>,其中SecondClassFirstClass的包装类,几乎暴露相同的属性,但由于各种原因需要从不相关的基类继承。例如:

// 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实现需要理解SecondClassFirstClass的属性之间的关系),并且它与{{1无关函数,但似乎就像它应该是可能的那样。

我该怎么做?

注意:我知道,我的API可能会公开Select以及帮助方法,以便在API用户为时将FirstClass转换为FirstClass “完成”创建他们的查询,但感觉很乱,我不喜欢以这种方式暴露我生成的类的想法。另外,我想知道如何从纯粹的学术角度来做上述事情。

1 个答案:

答案 0 :(得分:0)

可能你不应该返回IQueriable,而是Expression。然后,您将能够修改表达式,让LINQ从最终的Expression对象生成查询。示例如下:http://msdn.microsoft.com/en-us/library/bb882637.aspx