【发布时间】:2017-10-02 08:42:00
【问题描述】:
我首先使用实体框架代码来查询数据库, 问题是我不允许在数据库中创建视图, 所以我应该在我的代码中使用查询脚本。我希望实体框架将此查询脚本视为与 DBSet 或 IQueryable 相同,以便我可以对其应用 linq 查询。 我不希望它是 IEnumerable 所以“Database.SqlQuery”对我不起作用。
示例: 数据库中有 Product 表,其中包含 {Id,Name,CategoryId} 并且在 db 中有 Category 表,其中包含 {Id,Name}
我的查询脚本是这样的:
select Id,Name,CategoryId,CategoryName
from Product p
join Category c on p.CategoryId=c.Id
我想在我的代码中使用这个查询,就像它是一个视图一样。
有什么想法吗?
ps:查询脚本太复杂了,我无法用Linq构建它。
我使用 Interceptor 解决了这个问题, 这是解决方案:
在您的上下文中创建一个 Dbset,如下所示:
public DbSet<Model.MyView> MyViews { get; set; }创建 DbCommandInterceptor,并将其应用于您的实体框架配置
在拦截器中实现这个方法:
public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext),并像这样修改命令文本:command.CommandText = command.CommandText.Replace("[dbo].[MyViews]", "(" + MyViewScript + ")");
【问题讨论】:
标签: c# entity-framework iqueryable sql-scripts