我有一个实体表(比方说文档),其中每个文档可能有一个不同的实体连接到它(比方说权限)。权限具有文档表的外键。
例子:
架构:
Document -> Id | Data
Permission -> Id | EntityId | PermissionData
内容:
Document -> 1 | "This is my first doc"
Permission -> 12 | 1 | "This is doc 1's permission set"
如果Permission
是表,我不会有任何问题 - 我只需Include
在查询中使用该方法并获得连接的权限:
ctx.Include(d => d.Permission)...
但是,Permission
它实际上是一个复杂的方案,包括多个表,并且使用 SQL Server 表值函数进行计算。
我正在尝试创建一个Permission
实体,就像每个常规表实体一样,并简单地将实体框架配置为执行数据库函数调用而不是表连接。
如果权限是一个表并且我会将它包含在我的查询中,我希望 SQL 执行看起来像这样:
select *
from document d
join permission p on d.Id = p.EntityId
相反,我想实现这样的目标:
select *
from document d
join fn_getPermissions(p1,p2,p3...) p on d.Id = p.EntityId
假设参数 p1...pn 是硬编码的,但我需要在 C# 端而不是在 SQL Server 中默认它们。
我看到了一个选项来配置实体以使用 Entity Framework 使用存储过程,但我没有看到任何可以使用存储过程进行查询的地方,而不是用于插入、删除等。
我知道如何调用DBFunctions
(使用Conventions
)——我不是在寻找显式的函数调用。我想将 Permission 实体视为表实体,主要是因为我在实体框架上使用 OData,并且我不想仅为这种情况创建特定方法。
有没有办法完成这种行为?我正在使用 EF 6.x(不是核心)。