我有这个基本的实体设置:
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还不是很稳定? 谢谢!
答案 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之间的结果是准确的!
所以答案是我不应该相信,这是一个错误。感谢所有的帮助 - 当我有机会尝试新的提供商时,就在我们产品的测试版本上,我们现在不能。