2

假设我有以下2个实体。 (请原谅任何代码错别字,我是有点失眠症和并从内存打字)如何优化这个NHibernate的3.2 linq查询

public class Foo { 
    public virtual int Id {get;set;} 
    public virtual int Version {get;set;} 
    public virtual string SomeProp {get;set;} 
    public virtual Bar Bar {get;set;} 
} 

public class Bar { 
    public virtual int Id {get;set;} 
    public virtual int Version {get;set;} 
    public virtual string Name {get; set;} 
} 

//Fluent Mappings 
public class FooMapping :ClassMap<Foo> 
{ 
    public FooMapping() 
    { 
     Id (f => f.Id).GeneratedBy.Identity(); 
     Version(f => f.Version); 
     Map(f=> f.SomeProp).Column("fooprop1"); 
     References(f => f.Bar).Column("foobarid").Not.Null(); 
    } 
} 

public class BarMapping :ClassMap<Bar> 
{ 
    public BarMapping() 
    { 
     Id (b => b.Id).GeneratedBy.Identity(); 
     Version(b => b.Version); 
     Map(b => b.name).Column("barname"); 
    } 
} 

当我写这样的查询:

var query = from f in Session.Query<Foo>() 
      where f.Bar.Id == 5 
      select new {f.Id, f.SomeProp}; 

我注意到,NHibernate的生成SQL查询与Bar表的内部联接,然后它是Bar表Id的where子句。我怀疑这是否确保bar.id = 5是一个有效的酒吧ID?

我的问题是我如何告诉NHibernate让我单独查询foo表对foo.foobarid列。事情是这样的:

SELECT f.id, f.prop1 FROM foo f WHERE f.foobarid = 5

谢谢你提前为任何见解,您可以提供!

回答

2

好像这样的优化没有实现Linq(它被记录和为HQL工作)。

但是,您可以使用Bar对象作为解决方法。 session.load()不会碰到数据库,所以没有额外的性能成本。

var bar = Session.Load<Bar>(5); 
var query = from f in Session.Query<Foo>() 
      where f.Bar == bar 
      select new {f.Id, f.SomeProp}; 
+0

谢谢你的回复!它非常完美!希望后来的NH-Linq版本可以使用这种优化,但现在这对我来说很有用。 – NYCChris