智商到智商<T>

  • 本文关键字: linq entity-framework
  • 更新时间 :
  • 英文 :


是否有可能将 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,
    });
}

相关内容

  • 没有找到相关文章