c# - IQueryable 如何创建实体实例以及如何捕获它
问题描述
我有自己的IQueryable
课:
internal class IContextable<T> : IQueryable<T> where T : Entity
{
public IQueryable<T> SourceQuery { get; set; }
public KitchenAppContext Context { get; set; }
public IContextable(IQueryable<T> query, KitchenAppContext context)
{
SourceQuery = query;
Context = context;
}
public Type ElementType => SourceQuery.ElementType;
public Expression Expression => SourceQuery.Expression;
public IQueryProvider Provider => SourceQuery.Provider;
public IEnumerator<T> GetEnumerator()
{
foreach (var entity in SourceQuery)
{
if (entity.Context == null || entity.Context != Context)
entity.Context = Context;
yield return entity;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
我在从 EF 加载实体时使用它。如您所见,我想设置实体的上下文(在GetEnumerator
方法中)。
这是GetEntities
方法:
public IQueryable<T> GetEntities<T>() where T : Entity
{
IQueryable<T> query = Set<T>();
return new IContextable<T>(query, this);
}
当我这样做时它会起作用
var users = Context.GetEntities<User>().ToList();
它设置实体的上下文。但是当我这样做时
var users = Context.GetEntities<User>().Single();
GetEnumerator
将不起作用并且上下文将为空(与FirstOrDefault
, First
, ... 相同)。当实体从数据库加载时,我只想设置实体的上下文。我不能.ToList()
在GetEntities
方法中使用,因为这将是性能问题。我怎样才能做到这一点?这种情况有更好的解决方案吗?
解决方案
推荐阅读
- pytorch - 我们支持的最低 cuda 能力是 3.5
- r - 在 R 中重新排序李克特图
- python - 如何使用 BeautifulSoup 获取数据价格?
- python - 如果您在多核网格搜索中为 CV 拆分器提供随机种子,是否保证拆分在内核之间是相同的?
- java - 使用 Java API 的 TensorFlow 推理非常慢
- node.js - 如何在mongodb中查询子文档?
- php - 抽象方法没有被嘲笑
- c++ - 模板代码的 Intellisense 弹出窗口 (Visual Studio 2019)
- r - 有没有办法将处理过的表格保存回原始 Excel 文件,以便它可以有两张纸?1. 原创 2. 编辑
- laravel - 将我的网络摄像头的 Blob 原始数据从 Vue-axios 发送到 Laravel 后端