【发布时间】:2023-02-12 00:56:03
【问题描述】:
我正在使用 .Net 6 控制台应用程序,我需要从自定义的表中读取数据数据库上下文使用Microsoft.EntityFrameworkCore
我已将实体添加到模型中OnModelCreating()并可以通过调用来取回它们
var entity = ctx.Model.GetEntityTypes().FirstOrDefault(e => e.FullName().InfexOf(tableName) >= 0);
鉴于此,我如何检索数据列表,例如实体.ToList()- 为实体返回的类型是 IEntityType?。
作为替代方案(如果可能,也是我的首选方式),我使用反射创建了一个表数组(它们都继承自 BaseTable),它们存储为一个列表。
我想使用 DbContext.Set() 创建一个 DbSet<>,这样我就可以使用 Find()、AsNoTracking() 和其他此类命令(包括写操作)。
我有以下内容:-
IQueryable<Object>dbSet = (IQueryable<Object>)ctx
.GetType()
.GetMethod("Set",1,Type.EmptyTypes)
.MakeGenericMethod(t)
.Invoke(ctx, null);
这允许我执行类似 dbSet.ToList() 的操作,但我真的很想将其转换为 DbSet。
有谁知道是否可以进行这样的转换?
(我只从几组表中读取几条记录,然后将数据写回不同的数据库(具有相同的表)。
更新:*另一种思考方式:我正在遍历一组表。我需要取出 PK 和其他两列(我在运行时为其命名) - 如果第 1 列的值包含特定值,我需要更新第 2 列的值 *
【问题讨论】:
-
EF Core 就是关于加载/存储对象的。如果您实际上并不关心对象,您可能会发现使用原始 sql 工具会更容易。
-
你有例子吗?我更新了我原来的帖子,在底部澄清了我想做什么
-
如果这些表有一些共同点,那么这些类应该实现一个接口。然后您可以使用泛型从任何集合中加载和修改这些列。
Get<T>() where T:ICommon => db.Set<T>().Select(t => { t.Id, .... });然后用反射调用你的泛型方法。 -
谢谢回复。这里的假设是我在编译时知道这些字段(t.Id,...),但我不知道这些字段是在运行时计算的。这就是我尝试使用 Linq.Expression 在 Select() 语句中构建 lambda 的原因。
标签: c# entity-framework-core .net-6.0