如何执行SQL查询并返回一个对象?

Ja *_* Da 3 .net c# entity-framework-core ef-core-6.0

所以我正在从 .NET Framework 迁移到 .NET 6。我在一个函数中,我接手的那个人花了第 693 - 760 行在 SQL 中生成查询并获取结果:

var result = db.Database.SqlQuery<CustomObject>(sqlQuery.ToString(), parameters.ToArray());
Run Code Online (Sandbox Code Playgroud)

但我非常友善地获悉:

“DatabaseFacade”不包含“SqlQuery”的定义,并且找不到接受“DatabaseFacade”类型的第一个参数的可访问扩展方法“SqlQuery”(您是否缺少 using 指令或程序集引用?)

我正在System.Data.Entity按照文档所说使用。我知道我能做到db.[TableName].FromSqlRaw,但我不能使用它,因为我需要的对象不在数据库中。

我有以下包裹,但我可能缺少一些东西?

EntityFramework (6.4.4) Microsoft.EntityFrameworkCore (6.0.7) Microsoft.EntityFrameworkCore.Design (6.0.7) Microsoft.EntityFrameworkCore.Relational (6.0.7) Microsoft.EntityFrameworkCore.SqlServer (6.0.7)

Daw*_*wan 6

因此,我最近经历了从 EF 迁移到 EF Core 的相同过程。

如果您的实体不在数据库中,并且仅基于 SQL 查询,则可以使用Keyless实体并映射到NULL视图。文档:https://learn.microsoft.com/en-us/ef/core/modeling/keyless-entity-types? tabs=data-annotations

  1. 添加您的实体类(应与查询结果匹配)

    public class Person
    {
        public string Name { get; set; }
        public DateTime DateOfBirth { get; set; }  
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将集合添加到您的DbContext作为DbSet

    public class FooContext : DbContext
    {
        ....
        public virtual DbSet<Person> Persons { get; set; }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    要使实体无键,您可以使用属性[Keyless],或者使用 Fluent 语法DbContext

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder
                 .Entity<Person>()
                 .HasNoKey()
                 // ToView should be NULL, or you can Map to an SQL View here
                 .ToView(null);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后你可以这样查询Persons

    var paramss = new[] { new SqlParameter("@foo", 123) };
    
    fooContext.Persons.FromSqlRaw("SELECT Name, DateOfBirth From Persons", paramss).AsEnumerable();
    
    Run Code Online (Sandbox Code Playgroud)