【发布时间】:2014-01-14 15:01:39
【问题描述】:
简化域:
public class MasterDocument {
Guid ID;
Program StorageCompartment;
ISet<DocumentCompartment> Compartments;
}
public class Program {
int ID;
string GroupName;
}
public class DocumentCompartment {
int ID;
Program AssociatedCompartment;
MasterDocument AssociatedDocument;
}
public class Document {
Guid ID;
MasterDocument MasterDocument;
//Many more properties
}
我知道这有点令人费解,但是由于安全问题,我们已经通过将某些记录(如文档)放入与它们所属的程序/隔间(可互换术语)相对应的不同数据库来处理安全问题,因此存在这样的架构到。 MasterDocument、Program 和 DocumentCompartment 的表位于“主”数据库中,其中包含所有隔间的信息,而几个不同的数据库将各自包含自己的 Documents 表。无论如何,关于问题:
我正在尝试构建一个查询,通过该查询传递给我一个组名列表,并且我只想要没有关联隔间且不包含在该组名列表中的文档。
举个例子:
Doc1 与隔间 P1 关联
Doc2 与 P2、P3 和 P7 相关联
Doc3 与 P1 和 P3 关联
我想检查组:P1、P3、P4、P7(这些是我有权访问的组)
我应该取回 Doc1 和 Doc3,因为我没有 P2 的权限,而 Doc2 需要它。我可以通过以下查询使用 LINQ 提供程序来做到这一点:
string[] groups = new[] { "P1", "P3", "P4", "P7" };
return Session.Query<Document>().Where(doc => doc.MasterDocument.Compartments.All(comp => groups.Contains(comp.AssociatedCompartment.GroupName));
(还有关于上述内容的注释:如果我尝试将该逻辑封装在 Document 类中并将该方法传递给“Where”方法,例如 return Session.Query().Where(doc => doc.CanAccess(组)),然后我得到一个 System.NotSupportedException。我有点理解为什么,但如果有解决方法,那就太好了。)
生成的 SQL 如下所示:
exec sp_executesql
N'select
doc.DocumentGuid as guid
from Documents doc
where not (exists
(select comp.DocumentCompartmentID
from Master.MasterDocuments master,
Master.DocumentCompartments comp,
Master.Programs prog
where doc.DocumentGuid=master.DocumentGuid and
master.DocumentGuid=comp.DocumentGuid and
comp.CompartmentID=prog.ProgramID and
not (prog.ADGroupName in ('P1', 'P3', 'P4', 'P7'))
))',
我现在正试图弄清楚如何使用 NHibernate QueryOver 语法进行相同的查询。不幸的是,我没有足够的知识或经验来知道如何编写它。对此的任何帮助将不胜感激!
【问题讨论】:
标签: c# nhibernate queryover