在没有 DbSet 的情况下查询 Entity Framework Core
Posted
技术标签:
【中文标题】在没有 DbSet 的情况下查询 Entity Framework Core【英文标题】:Querying Entity Framework Core Without DbSet 【发布时间】:2021-08-23 12:28:56 【问题描述】:我正在使用 Entity Framework Core 开发一个数据驱动的解决方案。我使用ExecuteRawSQL()
动态创建 SQL Server 表,并根据我正在读取的文件的内容构建查询字符串。我想查询这些表,但我没有它们的 DbSet,因为它们是动态创建的。我尝试使用:
ExecuteRawSQL("SELECT * FROM ...")
但这只返回受影响的行数。
理想情况下,我希望以字典的形式从该查询中取回每一行(键 = 列名,值 = 列值)。有任何想法吗?谢谢!
【问题讨论】:
听起来你应该只使用 ADO.NET @ErikEJ 我沿着这条路走下去,它就像一个魅力!谢谢! 【参考方案1】:在 EF Core 中,您可以使用 DbContext Set<T>()
方法,然后使用 FromRawSql()
检索数据并将结果转换为未注册为 DbSet<T>
的域类。
在这个例子中,我创建了一个 Cat 对象来表示 Cats 表中的一行:
public class Cat
public int Id get; set;
public string Name get; set;
public string Breed get; set;
现在 EF Core 知道如何投影结果:
var context = new SampleDbContext();
var cats = context
.Set<Cat>()
.FromSqlRaw("SELECT * FROM Cats")
.ToList();
但是,您必须告诉 EF Core 将该对象映射到 DbContext
类上的数据库表:
protected override void OnModelCreating(ModelBuilder modelBuilder)
modelBuilder.Entity<Cat>().ToTable("Cats");
同样重要的是,您将结果投影到的对象与您从中提取数据的表具有完全相同的属性,否则您会遇到异常。
我不确定如何将结果格式化为字典,但可以在FromRawSql()
之后使用Select()
。
var links = context.Set<Cat>()
.FromSqlRaw("SELECT * FROM Cats")
.Select(c =>
new
Key = nameof(c.Id),
Value = c.Id
);
【讨论】:
以上是关于在没有 DbSet 的情况下查询 Entity Framework Core的主要内容,如果未能解决你的问题,请参考以下文章
在没有主键的情况下使用 Find 在 dbSet 中查找记录
在没有 DBSet 的情况下使用 c#linq 执行 SQL Server 存储过程
如何在 Entity Framework 4.4 中实现 DBSet.AddOrUpdate?
EF 6.0 中缺少 DbSet<entity>.Load() 函数