Linq to NHibernate返回的结果与HQL不同?

时间:2010-03-03 22:18:05

标签: c# linq nhibernate fluent-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。

有人可以解释在Linq查询中Id = 4的来源,还是NHibernate.Linq还不是很稳定? 谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

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