【问题标题】:How to return anonymous objects as the result of LINQ-to-SQL queries如何返回匿名对象作为 LINQ-to-SQL 查询的结果
【发布时间】:2017-09-17 10:30:59
【问题描述】:

我正在创建一个允许用户运行 SQL SELECT 命令的工具,结果将显示在 HTML 表中。我正在使用 ASP.NET Core MVC 并试图避免使用 SqlConnection/SqlCommand/etc。如果可能,直接通过DataContext

例如,如果有人输入

"SELECT Id, Name FROM Table"

结果是

Id | Name
------------
1  | 'Bob'
2  | 'Harry'

我希望Json(results) 成为

[
   { Id: 1, Name: "Bob" },
   { Id: 2, Name: "Harry"}
]

我认为结果的类型为IEnumerable<object>

我现在拥有的是我的存储库中的一个方法,例如

    public List<object> RunQuery(string query)
    {
        using(MyDbContext context = new MyDbContext())
        {
            return context.MiscTable.FromSql<object>(query).ToList();
        }
    }

但是我得到了一个例外,比如

$exception {System.InvalidOperationException:“FromSql”操作的结果中不存在所需的列“SomeColumn”。

其中SomeColumnMiscTable 上的某个列。所以显然我只能使用FromSql 查询特定的表。有没有办法做我想做的事?

【问题讨论】:

标签: c# asp.net-mvc linq asp.net-core asp.net-core-mvc


【解决方案1】:

您不能将 .FromSql 与 ad-hoc 模型一起使用。查询返回的字段必须完全与模型匹配(无缺失字段)。

EF Core 尚不支持 Ad-hoc/非实体模型,但已在路线图上。

https://github.com/aspnet/EntityFramework/wiki/Roadmap

非模型类型的原始 SQL 查询允许使用原始 SQL 查询来填充不属于模型的类型(通常用于非规范化视图模型数据)。

也不能返回匿名类,因为它们的类型只有在编译类型时才知道。您应该为数据库中的实体创建模型(通常每个表 1 个模型,但您也可以通过继承在一个表中拥有更多模型)。这就是 ORM 的用途。

如果您只需要原始查询,请直接使用 ADO.NET。 ORM 用于将表映射到类/对象。

【讨论】:

    【解决方案2】:

    我相信您可以使用.Include() 将其他表添加到您的 FromSql 操作的数据库集中。查看此链接以获取示例和其他上下文。

    https://docs.microsoft.com/en-us/ef/core/querying/raw-sql#composing-with-linq

    根据您的示例,您的查询可能如下所示:

    return context.MiscTable.Include(t => t.RelatedTable).FromSql<object>(query).ToList();
    

    免责声明:我实际上并没有尝试过,所以我不确定它是否真的有效。但这似乎是合理的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2011-05-21
      • 1970-01-01
      • 2021-06-02
      • 2016-05-01
      • 1970-01-01
      相关资源
      最近更新 更多