如何在 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&lt;T&gt; 构造函数的查询不是 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 来​​实现伪泛型类型,但我无法在我当前的项目中使用它。关于如何使用这个实现的文档几乎没有,希望你对这个 Thomas 有一些提示。链接:geekswithblogs.net/rgupta/archive/2010/06/23/…

以上是关于如何在 EF 上运行 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Docker 在 SQL Server 数据库上运行 EF Core 迁移?

如何比较 EF Core 插值查询中的整数列表

如何将表达式树转换为部分 SQL 查询?

如何编写转换为 T-SQL 的 EF Core 查询包含

如何得到EF查询生成的SQL

oracle 如何结束正在运行的语句