2011-09-09 44 views
5

数查询不必要交叉连接我使用此查询:防止在产生的SQL代码

return from oi in NHibernateSession.Current.Query<BlaInteraction>() 
select new BlaViewModel 
{ 
    ... 

    NoPublications = oi.Publications.Count(), 

    ... 
}; 

BlaInteraction包含出版物一个IList(即实体)。确定出版物的数量并不是真的需要为出版物做所有的联合。我可以阻止nhibernate在生成的sql中使用连接(例如使用投影???)吗?

谢谢。

基督教

PS:

这是NH生产什么(稍作改动):

select cast(count(*) as INT) from RelationshipStatementPublications publicatio21_, Publication publicatio22_ inner join Statements publicatio22_1_ on publicatio22_.StatementId=publicatio22_1_.DBId where publicatio21_.StatementId = 22762181 and publicatio21_.PublicationId=publicatio22_.StatementId 

这是就足够了:

select cast(count(*) as INT) from RelationshipStatementPublications publicatio21_ where publicatio21_.StatementId = 22762181 
+0

你知道它*是*保湿刊物吗? SQL事件探查器说的实际上是在服务器上运行的? – AakashM

+0

谢谢 - 对不起,你是对的。这些连接与“水合”无关。我编辑了这个问题并添加了一些sql。 – cs0815

+0

(不是一个nhibernate专家)事实上,它产生一个'CROSS JOIN'(在FROM子句中没有明确加入的表),这表明NHibernate缺乏关于对象之间关系的一些知识;但是,我首先要检查其查询和理想查询的SQL执行计划 - 可能是* SQL Server *能够解决这个问题。 – AakashM

回答

2

好到目前为止,我已经找到了最好的解决办法是使用FNH公式:

mapping.Map(x => x.NOPublications).Formula("(select count(distinct RelationshipStatementPublications.PublicationId) from RelationshipStatementPublications where RelationshipStatementPublications.StatementId = DBId)"); 

public virtual int NOPublications {get; private set;} 

当我从域名映射到我使用的视图模式:

NoPublications = oi.NOPublications, 

基督教

3

为什么不能你只是创建另一个查询?

Session.QueryOver<Publication>().Where(x => x.BlaInteractionId == idSentAsParameter).Select(Projections.RowCount()).SingleOrDefault<int>(); 

我认为这将工作

return from oi in NHibernateSession.Current.Query<BlaInteraction>() 
select new BlaViewModel 
{ 
    ... 
    NoPublications = Session.QueryOver<Publication>().Where(x => x.BlaInteractionId == oi.Id).Select(Projections.RowCount()).SingleOrDefault<int>(); 

    ... 
}; 

另一个编辑,你尝试过lazy="extra"

+0

谢谢。你能详细说明一下吗?我有一个BlaInteraction类,它包含一个IList 。我的查询将BlaInteraction的某些属性映射到视图模型,并计算每个BlaInteraction(TOP n)的发布数量。我的理由是,我想充分利用telerik的基于Linq的表达式引擎,它可以生成所有用于过滤,分页和排序的“内容”。 – cs0815

+0

添加了另一个示例,检查它是否可用 –

+0

这不起作用,我在尝试发布之前尝试过。 BlaInteraction的东西是来自陈述。任何语句都有Ilist ,它映射使用mapping.HasManyToMany(x => x.Publications)。表(“RelationshipStatementPublications”);我还有一个专门的RelationshipStatementPublications实体。所以像这样的东西应该工作:NoPublications = NHibernateSession.Current.QueryOver ()。其中​​(x => x.Statement.Id == oi.Id).Select(Projections.RowCount())。SingleOrDefault , 但我得到一个路径异常。 – cs0815