2010-03-03 73 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