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

时间:2017-10-02 08:42:00

标签: c# entity-framework iqueryable sql-scripts

我首先使用实体​​框架代码来查询数据库, 问题是我不允许在数据库中创建视图, 所以我应该在我的代码中使用查询脚本。我想通过实体框架将此查询脚本视为与DBSet或IQueryable相同,以便我可以对其应用linq查询。 我不希望它是IEnumerable,因此'Database.SqlQuery'对我不起作用。

例如: db中有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 解决了这个问题, 这是解决方案:

  1. 在您的上下文中创建一个Dbset,如下所示: public DbSet<Model.MyView> MyViews { get; set; }

  2. 创建DbCommandInterceptor,并将其应用于您的实体框架配置

  3. 在Interceptor中实现此方法: public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) ,并修改命令文本,如下所示: command.CommandText = command.CommandText.Replace("[dbo].[MyViews]", "(" + MyViewScript + ")");

1 个答案:

答案 0 :(得分:0)

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

https://msdn.microsoft.com/en-us/library/jj592907(v=vs.113).aspx