C# 如何在实体框架中将查询脚本用作IQueryable或DBSet

C# 如何在实体框架中将查询脚本用作IQueryable或DBSet,c#,entity-framework,iqueryable,sql-scripts,C#,Entity Framework,Iqueryable,Sql Scripts,我首先使用实体框架代码查询数据库, 问题是我不允许在数据库中创建视图, 所以我应该在代码中使用查询脚本。我希望这个查询脚本被视为与DBSet或IQueryable by entity framework相同,以便可以对其应用linq查询。 我不希望它是IEnumerable,所以“Database.SqlQuery”对我不起作用 例如: 数据库中有一个产品表,它包含{Id,Name,CategoryId} db中有一个Category表,它包含{Id,Name} 我的查询脚本如下所示: sele

我首先使用实体框架代码查询数据库, 问题是我不允许在数据库中创建视图, 所以我应该在代码中使用查询脚本。我希望这个查询脚本被视为与DBSet或IQueryable by entity framework相同,以便可以对其应用linq查询。 我不希望它是IEnumerable,所以“Database.SqlQuery”对我不起作用

例如: 数据库中有一个产品表,它包含{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构建它

我用拦截器解决了这个问题, 以下是解决方案:

  • 在您的上下文中创建一个Dbset,如下所示:
    public DbSet MyViews{get;set;}

  • 创建DbCommandInterceptor,并将其应用于实体框架配置

  • 在拦截器中,实现此方法:
    public void reader执行(DbCommand命令,DbCommandInterceptionContext interceptionContext)
    ,并修改命令文本,如下所示:
    command.CommandText=command.CommandText.Replace(“[dbo].[MyViews]”,“(“+MyViewScript+”)”)


  • 您可以使用EF执行原始SQL查询:


    您可以使用EF执行原始SQL查询: