是否有可能将 IQueryable 对象转换为 IQueryable,其中 T 是映射实体?(T 将是一个 POCO 类)。
提前谢谢。
> Cast<T>()
它。 假设它是相同类型的可查询对象。 否则,您可以使用OfType<T>()
筛选方法筛选出特定类型的项目。
IQueryable query = ...;
IQueryable<MyType> x = query.Cast<MyType>(); // assuming the queryable is of `MyType` objects
IQueryable<MyDerivedType> y = query.OfType<MyDerivedType>(); // filter out objects derived from `MyType` (`MyDerivedType`)
但是,在您的情况下,您说您正在使用动态 LINQ 并执行动态投影。 考虑这个完全编造的查询:
var query = dc.SomeTable
.Where("SomeProperty = "foo"")
.Select("new (SomeProperty, AnotherProperty)");
它会导致类型为 IQueryable
的查询。 您不能将其转换为特定类型的查询IQueryable<T>
毕竟,T
是什么? 动态 LINQ 库的作用是创建一个派生自 DynamicCass
的类型。 你可以投射到IQueryable<DynamicClass>
(query.Cast<DynamicClass>()
),但你无法访问这些属性,所以这是没有意义的。
实际上,在这种情况下,您唯一不错的选择是使用dynamic
来访问这些属性。
foreach (dynamic x in query)
{
string someProperty = x.SomeProperty;
int anotherProperty = x.AnotherProperty;
// etc...
}
如果要将其转换为 POCO 对象的查询,则必须将转换作为单独的步骤执行,但使用 LINQ to Objects。
IEnumerable<SomePoco> query =
dc.SomeTable
.Where("SomeProperty = "foo"")
.Select("new (SomeProperty, AnotherProperty)")
.Cast<DynamicObject>().AsEnumerable().Cast<dynamic>()
.Select(x => new SomePoco
{
SomeProperty = x.SomeProperty,
AnotherProperty = x.AnotherProperty,
});
如果必须有一个IQueryable<T>
,那么首先不应该使用动态投影。
IQueryable<SomePoco> query =
dc.SomeTable
.Where("SomeProperty = "foo"")
.Select(x => new SomePoco
{
SomeProperty = x.SomeProperty,
AnotherProperty = x.AnotherProperty,
});
看到强制转换如何不适用于 LINQ to Entities,那么我想您必须获得 POCO 对象的强类型集合的唯一选择是将其分解为一个循环。
var query = dc.SomeTable
.Where("SomeProperty = "foo"")
.Select("new (SomeProperty, AnotherProperty)");
var result = new List<SomePoco>();
foreach (dynamic x in query)
{
result.Add(new SomePoco
{
SomeProperty = x.SomeProperty,
AnotherProperty = x.AnotherProperty,
});
}