【问题标题】:Unable to read system views in Entity Framework无法读取实体框架中的系统视图
【发布时间】:2016-01-27 11:46:34
【问题描述】:

我正在尝试执行以下查询

  SELECT object_id 
  FROM sys.tables 
  WHERE sys.tables.name = 'Projects'

作为

int n = context.Database.SqlQuery<int>(
      "SELECT object_id from sys.tables where sys.tables.name = 'Projects'")
      .FirstOrDefault();

我总是得到 n 0

如果我使用SqlConnection 并使用SqlCommand 查询它,我会得到正确的结果。那么为什么DbContext.Database.Connection 不让我执行一个普通的 SQL 查询呢?

为简单起见,我删除了SqlParameter,所以我知道这段代码不是 SQL 注入安全的。

【问题讨论】:

  • 我认为您的表名不存在。如果我运行查询(在将名称更改为有效的名称后)它工作正常

标签: c# sql .net entity-framework-6


【解决方案1】:

系统视图没有问题,Entity Framework 无法读取 SqlQuery 中的值类型。所以我不得不改变它,

public class SingleValue<T>{
    public T Value {get;set;}
}

int n = context.Database.SqlQuery<SingleValue<int>>(
  "SELECT object_id as Value from sys.tables where sys.tables.name = 'Projects'")
  .ToList().Select(x=>x.Value).FirstOrDefault();

【讨论】:

    【解决方案2】:

    我觉得Database.SqlQuery的结果应该先转换成list:

    试试这个:

    int n = context.Database.SqlQuery<int>(
      "SELECT object_id from sys.tables where sys.tables.name = 'Projects'")
      .ToList().FirstOrDefault();
    

    【讨论】:

    • 不,不应该。从文档Note that, just as for LINQ queries, the query is not executed until the results are enumerated 中,调用FirstOrDefault() 也会枚举查询
    猜你喜欢
    • 2014-04-03
    • 2011-01-14
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多