如何优化这个NHibernate 3.2 linq查询

时间:2011-11-08 10:35:24

标签: sql-server-2005 nhibernate fluent-nhibernate linq-to-nhibernate

假设我有以下2个实体。 (请原谅任何代码拼写错误,我有点失眠,并从记忆中输入此内容)

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生成了一个带有内部连接到Bar表的sql查询,然后它就是Bar表的Id上的where子句。我怀疑这样做是为了确保bar.id = 5是一个有效的条形码?

我的问题是我怎么能告诉NHibernate让我只针对foo.foobarid列查询foo表。像这样:

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

提前感谢您提供的任何见解!

1 个答案:

答案 0 :(得分: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};