Return 来自 EF 代理对象的 IQueryable
Return IQueryable from EF proxy object
假设我有以下 DbSet
:
public class X {
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Y> YCollection { get; set; }
}
当我想检索 X
的第 1 项时,我执行 DbSet<X>.Find(1);
,其中 returns 我是一个 EF 代理对象。
既然这个代理对象 (X
) 包含多个 Y
,我想将 YCollection
作为 IQueryable<Y>
检索。 (主要是在从数据库中检索之前对其进行一些额外的过滤。)
如何将 YCollection
检索为 IQueryable<Y>
?
据我所知,无法直接从实体本身执行此操作,但您可以使用上下文本身来形成查询:
var x = context.DbSet<X>.Find(1);
var query = context.Entry(x).Collection(x => YCollection).Query();
我想这可以包含在一个扩展方法中,像这样使用:
x.YCollection.AsQueryable(context);
您可以为此使用 LINQ 扩展方法:
using System.Linq;
//....
x.YCollection.AsQueryable();
但随后它将作为 LINQ to Objects 而不是 LINQ to Entities 执行。因此,如果您只需要一个 IQueryable 对象而不是出于性能问题需要它,则可以使用它。
假设我有以下 DbSet
:
public class X {
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Y> YCollection { get; set; }
}
当我想检索 X
的第 1 项时,我执行 DbSet<X>.Find(1);
,其中 returns 我是一个 EF 代理对象。
既然这个代理对象 (X
) 包含多个 Y
,我想将 YCollection
作为 IQueryable<Y>
检索。 (主要是在从数据库中检索之前对其进行一些额外的过滤。)
如何将 YCollection
检索为 IQueryable<Y>
?
据我所知,无法直接从实体本身执行此操作,但您可以使用上下文本身来形成查询:
var x = context.DbSet<X>.Find(1);
var query = context.Entry(x).Collection(x => YCollection).Query();
我想这可以包含在一个扩展方法中,像这样使用:
x.YCollection.AsQueryable(context);
您可以为此使用 LINQ 扩展方法:
using System.Linq;
//....
x.YCollection.AsQueryable();
但随后它将作为 LINQ to Objects 而不是 LINQ to Entities 执行。因此,如果您只需要一个 IQueryable 对象而不是出于性能问题需要它,则可以使用它。