我相信我在这里错过了一些明显的东西,我无法弄清楚。我receieve除外:实体框架包含在哪里子查询
LINQ实体无法识别方法 'System.Linq.IQueryable
1[Privilege] Include[Privilege,PrivilegeType](System.Linq.IQueryable
1 [特权],System.Linq.Expressions.Expression1[System.Func
2 [特权,PrivilegeType]])' 方法,并且此方法不能转换为商店表达式。
当我运行此EF查询:
return _context.Categories.Where(c =>
_context.Privileges
.Include(p => p.PrivilegeType)
.Where(p => p.PrivilegeType.Code == "code").Any()).ToList();
最终的结果,我追求的是确定用户是否具有基于的categoryId特权。目前,我已经省略了Any()子句中的条件来简化语句。
这种类型的查询可能吗?
编辑: 这里是FulentApi配置:
public class PrivilegeConfiguration : EntityTypeConfiguration<Privilege>
{
public PrivilegeConfiguration()
{
ToTable("ObjectPrivileges");
HasKey(p => new { p.ObjectTypeId, p.ObjectId, p.PrivilegeTypeId });
Property(p => p.ObjectTypeId)
.HasColumnName("ObjectType")
.HasMaxLength(2);
Property(p => p.PrivilegeTypeId)
.HasColumnName("PrivilegeID")
.IsRequired();
HasRequired(p => p.PrivilegeType);
}
}
public class PrivilegeTypeConfiguration : EntityTypeConfiguration<PrivilegeType>
{
public PrivilegeTypeConfiguration()
{
ToTable("PrivilegeType");
HasKey(p => p.PrivilegeTypeId);
Property(p => p.PrivilegeTypeId)
.HasColumnName("PrivilegeID");
Property(p => p.ObjectTypeId)
.HasColumnName("ObjectType")
.HasMaxLength(2);
Property(p => p.Code)
.HasMaxLength(50);
Property(p => p.Description)
.HasMaxLength(255);
}
}
编辑2:
WHERE条件是我想拖放到查询来限制的记录数那会回来。我正在更新遗留数据库,并尝试匹配他们目前已有的数据库,以使其尽可能接近。
这里是我attemping全面查询:
var query = _context.Categories.AsQueryable();
if (!string.IsNullOrEmpty(privilege))
query = query.Where(c => (!_context.Privileges
.Include(p => p.PrivilegeType)
.Any(p => p.PrivilegeValue == 1
&& p.PrivilegeType.Code == privilege
&& p.ObjectTypeId == objectTypeId
&& p.ObjectId == c.CategoryId))
||
_context.Privileges
.Include(p => p.PrivilegeType)
.Any(p => p.PrivilegeValue == 1
&& p.PrivilegeType.Code == privilege
&& p.ObjectTypeId == objectTypeId
&& p.ObjectId == c.CategoryId
&& (p.UserId == userId || _context.UserGroups.Select(ug => ug.UserID).Contains(userId))));
这里是我想要做什么SQL表示:
SELECT * FROM Categories WHERE(
(NOT EXISTS
(
SELECT P.ObjectType
FROM ObjectPrivileges P
INNER JOIN PrivilegeType PT ON P.PrivilegeID = PT.PrivilegeID
WHERE
(
P.PrivilegeValue > 0
AND PT.Code ='code'
AND P.ObjectType = 'SELECT'
AND P.ObjectID = 1 -- CategoryId
)
)
) OR
EXISTS
(
SELECT P.ObjectType
FROM ObjectPrivileges P
INNER JOIN PrivilegeType PT ON P.PrivilegeID = PT.PrivilegeID
WHERE
(
P.PrivilegeValue > 0
AND PT.Code = 'code'
AND P.ObjectType = 'SELECT'
AND P.ObjectID = 1 -- CategoryId
AND (P.UserID = 57 OR P.GroupID IN (SELECT GroupID FROM Group_User WHERE UserID = 57))
)
))
你映射的外键关系?你能告诉我们你的实体代码和映射代码吗? –
你不应该在你的lambda中的任何地方使用'c'吗? – dcg
@RobertPetz我在编辑中添加了映射代码。 – InvaderZim