【问题标题】:Querying Entity Framework Core Without DbSet在没有 DbSet 的情况下查询 Entity Framework Core
【发布时间】:2021-08-23 12:28:56
【问题描述】:

我正在使用 Entity Framework Core 开发一个数据驱动的解决方案。我使用ExecuteRawSQL() 动态创建 SQL Server 表,并根据我正在读取的文件的内容构建查询字符串。我想查询这些表,但我没有它们的 DbSet,因为它们是动态创建的。我尝试使用: ExecuteRawSQL("SELECT * FROM ...") 但这只返回受影响的行数。

理想情况下,我希望以字典的形式从该查询中取回每一行(键 = 列名,值 = 列值)。有任何想法吗?谢谢!

【问题讨论】:

  • 听起来你应该只使用 ADO.NET
  • @ErikEJ 我沿着这条路走下去,它就像一个魅力!谢谢!

标签: c# sql-server entity-framework .net-core entity-framework-core


【解决方案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
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多