使用* sql *子查询进行实体框架查询

时间:2012-08-06 14:38:34

标签: c# .net sql entity-framework ef-code-first

简而言之:我可以在实体模型中以某种方式使用文字SQL子查询而不使用数据库视图吗?

上下文:我有一堆导致C#对象的ADO.NET查询。这些对象直接对应于查询形状;即我可以ObjectContext.TranslateSqlDataReader中提取它们。有很多这些查询,很多很复杂,其中一些使用实体框架不支持的功能(而循环,CTE,层次结构等) - 将这些(遗留)查询转换为LINQ是不可行的。 / p>

但是,我真的希望能够包装这些结果并在C#方面添加一些自定义过滤:排序,过滤,分页等。我可以将每个查询转换为视图(或存储程序)并映射这些,但这是一个麻烦和维护的噩梦 - 但原则上EF可以与该路线的“不透明”SQL查询一起使用。

我可以以某种方式使用SQL编写的子查询和实体模型吗?返回ObjectContext.Translate而非IQueryable的{​​{1}}将是理想的,但不是必需的:绝大多数查询都是编译时常量,因此可以进行某种形式的预处理

编辑: 我正在寻找返回IEnumerable的内容,因此我可以添加过滤器/排序客户端,但在数据库上执行它们(如通常)。我正在使用实体框架代码优先。

2 个答案:

答案 0 :(得分:3)

您可以将EntitySet的DefiningQuery属性设置为某些文字SQL。这些或多或少等同于SQL视图。这会解决您的问题吗?

http://msdn.microsoft.com/en-us/library/cc982038.aspx

答案 1 :(得分:1)

如果您的SQL查询提供的结果与实体类的结构相同,则可以使用DbContext.SqlQuery

 var customer=context.Database.
         SqlQuery<Customer>("SELECT ID,NAME from CUSTOMER WHERE TYPE IN 
                     (SELECT TYPEID FROM IMPORTANT_TYPE)");

假设context是您的DBContext类对象

相关问题