2009-11-09 66 views
0

我有一個簡單的NHibernate的LINQ的查詢比預期返回更多結果:爲什麼NHibernate Linq複製結果?

var result = (from foo in session.Linq<Foo>() 
         where foo.High.ID == High.ID 
         select foo).ToArray(); 

美孚看起來是這樣的:

public class Foo : DomainLayerSuperType 
{ 
    // ...other members omitted for clarity 
    protected IList<Bar> associatedBars; 

} 

我的問題是我在得到一個複製美孚每一個酒吧' associatedBars的集合。因此,如果Foo實例的集合中有20個酒吧,我會得到20個Foo實例,每個實例都有20個酒吧。

的映射的Foo:(FluentNhibernate)

//other mappings omitted 
HasMany<Bar>(x => x.AssociatedBars) 
       .Access.CamelCaseField() 
       .AsBag() 
       .Table("dbo.Bar") 
       .KeyColumn("FooID") 
       .Cascade.AllDeleteOrphan() 
       .Inverse() 
       .Fetch.Join(); //eager load 

當我執行該等效HQL查詢,不會發生該問題:

var query = new StringBuilder(); 
query.AppendFormat("select foo from Foo foo where foo.High.ID = {0}", High.ID); 
var result = session.CreateQuery(query.ToString()).List<Foo>().ToArray(); 

此外,當我更改映射爲富,爲AssociatedBars使用延遲加載,問題不會發生。

任何想法?另外,Nh Linq的最佳論壇在哪裏?我找不到這樣張貼的人!

回答

3

問題是,當前的linq提供程序是基於標準查詢。當你在映射中設置Fetch.Join屬性時,如果你檢查了生成的sql查詢,你將在那裏看到join。由於此連接,您將獲得重複的結果。

在HQL中NHibernate使用不同的方式來生成sql查詢和sql會很類似於你的HQL,這就是爲什麼沒有連接和沒有重複的列。

對於liq查詢,您可以嘗試使用Distinct擴展來獲取查詢中唯一的結果。

有一個project目前正在開發基於HQL解析器創建linq提供程序

相關問題