2010-03-03 110 views
3

我有这个基本的实体设置:Linq到NHibernate返回的结果不同于HQL吗?

public class Instrument 
{ 
    public virtual int Id { get; set; } 
    public virtual Guid? InstrumentGuid { get; set; } 
    public virtual string FIPSCode { get; set; } 
    public virtual IList Names {get; set;} 
} 

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

映射:

public class InstrumentMap: ClassMap<Instrument> 
{ 
    public InstrumentMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.InstrumentGuid).Not.Nullable(); 
     Map(x => x.FIPSCode).Not.Nullable(); 
     HasMany(x => x.Names).Casecade.All; 
    } 
} 

public class NameMap : ClassMap<Name> 
{ 
    public NameMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     References(x => x.Instrument); 
    } 
} 

那么,为什么,当我做这两个查询做我得到不同的结果?

var namelist = from name in Session.Linq() 
    where name.Instrument.Id == 1 
    select name; 

我得到3分的结果,2其中Instrument.Id = 1和1,其中Instrument.Id = 4 VS:

var querystr = "select name From Name as name where name.Instrument.Id = 1"; 
var hqlresult = Session.CreateQuery(querystr).List(); 

这得到只有2个结果,其中Instrument.Id = 1

有人可以解释在哪里Id = 4来自Linq查询,或NHibernate.Linq不是很稳定吗? 谢谢!

+0

你试过了吗?看着NHibernate日志的输出?你可以将其配置为输出SQL。 https://www.hibernate.org/364.html。 SQL可能会给你一个线索,说明你的映射是错误的。 – 2010-03-03 22:25:54

+0

出于好奇,ID = 4是数据库返回结果中的最后一个(或可能是第一个)?它可能只是NHibernate.Linq使用的枚举器中的一个错误。 – jrista 2010-03-03 22:26:11

+0

是的最后一个添加到存储库。经过更多测试后,如果我使用左连接名称做一个HQL查询。仪器作为inst,我得到相同的结果 – cjazz108 2010-03-03 23:21:20

回答

0

嗯,我在Sqllite提供程序上启用ShowSql(我用于测试),并发现它正在为每个选择创建可供选择的代码。

由于某些原因,只有Linq提供程序(包含2.0和3.0语法都会留下存储库中的最后一项,这不是sql查询的一部分),我通过sqlite3.exe重新创建了SQL,两个是相同的。哦,它只发生在Id字段。当我引用一个不同的字段(guid)并使用where子句= Linq和HQL之间的结果是准确的!

所以答案是不应该我相信,并且是一个bug。感谢所有的帮助 - 当我有机会我会尝试新的提供商,但现在不能在我们的产品的测试版本。

0

这听起来像您使用的linq提供程序中的错误。您使用的linq提供程序来自NHibernate.Contrib。该提供者基于api标准。这个api可能会产生与hql不同的sql。这两个查询创建的sql是什么?

在NHibernate中,trunk是一个基于hql的新linq提供程序。这个linq提供程序将生成与hql相同的sql。我在我目前正在使用的一个应用程序中从旧的提供者转移到新的提供者。它接缝的功能比旧的更多,但仍未完成。

+0

我正在使用NHibernate.Linq v 1.1.0.1001我还没有看到更新的东西 - 或者它仍然测试版? – cjazz108 2010-03-03 23:22:47

+0

哦主干...所以我不得不从源代码编译? – cjazz108 2010-03-03 23:50:19

+0

@ cjazz108:你可以从Hornget获得主干的二进制文件:http://www.hornget.net/packages/orm/nhibernate/nhibernate-trunk – 2010-03-04 10:25:16