Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “选择”或“包装”IQueryable以使其仍然可查询_C#_.net_Linq_Linq To Entities_Iqueryable - Fatal编程技术网

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

C# “选择”或“包装”IQueryable以使其仍然可查询,c#,.net,linq,linq-to-entities,iqueryable,C#,.net,Linq,Linq To Entities,Iqueryable,我有一个使用IQueryable数据源的类/API,但是我希望公开IQueryable,其中SecondClass是FirstClass的包装类,它公开几乎相同的属性,但是由于各种原因,需要从无关的基类继承。例如: // My API void IQueryable<SecondClass> GetCurrentRecords() { return from row in dataSource /* Linq query */ se

我有一个使用IQueryable数据源的类/API,但是我希望公开IQueryable,其中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简单地编译上面的代码,但是我想公开一个真正的IQueryable,它可以基于API用户查询高效地查询数据库

我知道这不是小事,我的包装器IQueryable实现需要理解SecondClass和FirstClass的属性之间的关系,它与Select函数无关,但它似乎应该是可能的

我该怎么做


注意:我知道我的API可以只公开FirstClass和一个助手方法,以便在API用户创建完查询后将FirstClass转换为SecondClass,但这感觉很混乱,我不喜欢以这种方式公开生成的类。另外,我想知道如何从纯学术的角度来完成上述操作。

可能,您不应该返回IQueriable,而应该返回表达式。然后,您将能够修改表达式,并让LINQ从最终的表达式对象生成查询。示例如下:

可能,您不应该返回IQuerable,而应该返回表达式。然后,您将能够修改表达式,并让LINQ从最终的表达式对象生成查询。示例如下:

如果没有未包含的代码,此问题将毫无意义。L2E已经对ObjectQuery执行了此操作。您自己的代码生成数据源可能没有,但您还没有显示出来。@Craig我不明白-您需要看到什么?dataSource只是从ObjectQuery继承的生成类。你是说这应该已经起作用了?这是什么魔法!?!如果dataSource是ObjectQuery,那么您的查询将在运行时失败,因为L2E不支持参数化构造函数。但是神奇的是,它已经返回IQueryable并支持SQL支持的进一步组合。看,如果没有您没有包含的代码,这个问题是毫无意义的。L2E已经对ObjectQuery执行了此操作。您自己的代码生成数据源可能没有,但您还没有显示出来。@Craig我不明白-您需要看到什么?dataSource只是从ObjectQuery继承的生成类。你是说这应该已经起作用了?这是什么魔法!?!如果dataSource是ObjectQuery,那么您的查询将在运行时失败,因为L2E不支持参数化构造函数。但神奇的是,它已经返回IQueryable并支持SQL支持的进一步组合。请参阅