简而言之:我可以在实体模型中以某种方式使用文字SQL子查询而不使用数据库视图吗?
上下文:我有一堆导致C#对象的ADO.NET查询。这些对象直接对应于查询形状;即我可以ObjectContext.Translate
从SqlDataReader
中提取它们。有很多这些查询,很多很复杂,其中一些使用实体框架不支持的功能(而循环,CTE,层次结构等) - 将这些(遗留)查询转换为LINQ是不可行的。 / p>
但是,我真的希望能够包装这些结果并在C#方面添加一些自定义过滤:排序,过滤,分页等。我可以将每个查询转换为视图(或存储程序)并映射这些,但这是一个麻烦和维护的噩梦 - 但原则上EF可以与该路线的“不透明”SQL查询一起使用。
我可以以某种方式使用SQL编写的子查询和实体模型吗?返回ObjectContext.Translate
而非IQueryable
的{{1}}将是理想的,但不是必需的:绝大多数查询都是编译时常量,因此可以进行某种形式的预处理
编辑: 我正在寻找返回IEnumerable
的内容,因此我可以添加过滤器/排序客户端,但在数据库上执行它们(如通常)。我正在使用实体框架代码优先。
答案 0 :(得分:3)
您可以将EntitySet的DefiningQuery
属性设置为某些文字SQL。这些或多或少等同于SQL视图。这会解决您的问题吗?
答案 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类对象