在没有 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() 函数

从源代码分析DbSet如何通过ObjectStateManager管理entity lifecycle的生命周期

csharp 虚假实现Entity Framework的DbSet以进行快速单元测试