2016-01-27 42 views
6

我想无法在实体框架

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注入安全的。

+0

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

回答

0

我认为Database.SqlQuery结果应该先转换为列表:

试试这个:

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

不,它不应该。从文档'请注意,就像LINQ查询一样,查询在枚举结果之前不会被执行,调用'FirstOrDefault()'也会枚举查询 –

1

没有与系统的观点没有问题,实体框架无法读取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();