如何在 EF 上运行 SQL 查询?
Posted
技术标签:
【中文标题】如何在 EF 上运行 SQL 查询?【英文标题】:How to run SQL Queries on EF? 【发布时间】:2011-04-27 03:02:47 【问题描述】:我正在使用 C# 和 WPF 作为前端的 EF。我需要提供一个用户界面,以便用户可以创建自己的查询并获得结果。 UI 将是可供选择的表格列表和列列表(对 UI 不满意。需要改进,但我想到了新的提示)。
所以我的问题是如何创建、合并(现有查询)和执行查询。
有sql类Entity Client provider,objectquery类。我使用了 ObjectQuery
string querystring = @"SELECT PrjDev FROM prjscenario";
ObjectQuery<PrjDev> prjdevquery = new ObjectQuery<PrjDev>(querystring, ptxobjcontext);
string cpmmandtext = prjdevquery.CommandText;
int prjdevnum = prjdevquery.Count();
它正在工作。但是当我运行一些复杂的查询时。它不工作。示例代码:
string querystring = @"SELECT PrjDev FROM prjscenario WHERE PrjDev.PrjDevType = 10";
错误:
'PrjDevType' 不是 'Transient.collection[Skm.Ptx.Data.Emf.PrjDev(Nullable=True,DefaultValue=)]'。 提取集合的属性 元素,使用子查询进行迭代 在收藏。近乎简单 标识符,第 1 行,第 45 列。
任何想法,为什么它适用于一个简单的查询,但它不适用于复杂的查询?
提前致谢, 否
【问题讨论】:
【参考方案1】:作为参数传递给ObjectQuery<T>
构造函数的查询不是 SQL 查询,而是 ESQL(实体 SQL)查询。虽然语法相似,但它们是非常不同的语言。您可以了解有关 ESQL 的更多信息on this page。
如果你想对 ObjectContext 的底层数据库执行真正的 SQL,你可以使用 ObjectContext.ExecuteStoreQuery
方法,或者只是通过 ObjectContext.Connection
属性检索连接并从那里编写“经典”ADO.NET 代码。
【讨论】:
嗨,Thomas,我正在查看 ExecuteStoreQuery 和 E SQL。第一个 ExecuteStoreQuery 对我来说看起来不错。它完美地适用于简单的查询。但是当我通过连接三个表的复杂查询时。它因错误而中断,例如数据读取器与指定的“Emf.PrjDevCable”不兼容。类型的成员“PrjDevID”在数据读取器中没有同名的对应列。 它不适用于匿名类型,仅适用于命名类型(因为您不能将匿名类型指定为泛型类型参数)。查询需要返回与模型中相同的列名 谢谢。我解决了这个问题来这里回答我看到你的帖子。我做了同样的事情。我正在使用 Select Name,Type From Table Joins ......现在我使用 Select * From Table Join.... 简短地说,L2S 支持两者。但 EMF 仅适用于 Select * ....谢谢,N 我在一些博客中听说您可以使用 ExecuteStoreQuery以上是关于如何在 EF 上运行 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章