我正在使用实体框架数据库第一个模型,我在查询我的数据库时遇到了问题。
我正在尝试使用以下代码:
var ctx = new dbEntities();
var description = ctx.DEPARTMENTs.SqlQuery("SELECT DESCRIPTION FROM DEPARTMENT WHERE DEPARTMENT='FINANCE'");
System.Diagnostics.Debug.WriteLine(description);
我可以在调试日志中看到DEPARTMENTs
表的结果表,但由于某种原因,SQL查询只是在控制台中返回我,而不是执行查询,任何人都知道为什么?
SELECT DESCRIPTION FROM DEPARTMENT WHERE DEPARTMENT='FINANCE'
答案 0 :(得分:7)
要针对提供商执行查询,您必须使用从IEnumerable
派生的任何扩展,即ToList()
或First()
或FirstOrDefault()
现在你必须考虑一些事情。您的查询可能会返回什么?数据列表还是单个数据?或者即使找到匹配列表,您也只想要一个匹配?
从查询的语法中我假设您应该这样做:
var ctx = new dbEntities();
var dep = ctx.DEPARTMENTs
.SqlQuery("SELECT * FROM DEPARTMENT WHERE DEPARTMENT='FINANCE'")
.FirstOrDefault();
if(dep!=null)
{
var description = department.Description;
}
或者,您也可以这样做(我更喜欢):
var description = ctx.DEPARTMENTs.Where(s=>s.Department.ToUpper() =="FINANCE")
.Select(s=>s.Description)
.FirstOrDefault();
答案 1 :(得分:4)
尝试:
var description = ctx.DEPARTMENTs.SqlQuery<string>("SELECT DESCRIPTION FROM DEPARTMENT WHERE DEPARTMENT='FINANCE'").ToList();
编辑:原始SQL查询 http://msdn.microsoft.com/en-us/data/jj592907.aspx
请注意,就像LINQ查询一样,在枚举结果之前不会执行查询 - 在上面的示例中,这是通过调用ToList来完成的。
System.Diagnostics.Debug.WriteLine(Object)将对象的ToString方法的值写入Listeners集合中的跟踪侦听器。 Debug.WriteLine(Object)
答案 2 :(得分:1)
SqlQuery
返回DbSqlQuery<TEntity>
个对象。在你的情况下,它可能是DbSqlQuery<DEPARTMENTs>
。正如文档所说
表示从a创建的实体的SQL查询 System.Data.Entity.DbContext并使用来自的连接执行 那个背景。这个类的实例是从 System.Data.Entity.DbSet实体类型的实例。该 创建此对象时不执行查询;它是每个执行 它被枚举的时间,例如使用foreach。 SQL查询 非实体是使用 System.Data.Entity.DbContext.Database。看到 System.Data.Entity.Infrastructure.DbSqlQuery用于非泛型版本 这个班。
请注意
行创建此对象时不执行查询;它被执行了 每次枚举时,例如使用foreach。
这意味着你必须迭代才能得到结果。