2010-02-25 54 views
1

短版 該查詢工作在數據庫中,但無法使用LINQ to NHibernate的羣體。爲什麼?NHibernate的子查詢的Linq - 如何選擇由ID包含某個項目

var items = (from g in db.Find<DataGroupInfo>() 
       where (from d in g.data where d.Id == dataID select d).Count() > 0 
       select g).ToList(); 

詳細龍版

我有NHibernate的Automapper具有多對多關係映射的兩個對象。

return Fluently.Configure() 
    //a few other settings here... 
    //relevant settings below 
       .Override<DataGroupInfo>(map => 
       { 
        map.HasManyToMany(d => d.data); 
       } 
       .Conventions.Add(DefaultCascade.All()) 
       .Conventions.Add(DefaultLazy.Never()) 


public class DataInfo 
{ 
    public virtual int Id { get; private set; } 
    public virtual DateTime created { get; set; } 
    public virtual string label { get; set; } 
    public virtual string description { get; set; } 
} 

public class DataGroupInfo 
{ 
    public virtual Int32 Id { get; set; } 

    public virtual DateTime created { get; set; } 
    public virtual string label { get; set; } 
    public virtual string description { get; set; } 

    public virtual IList<DataInfo> data { get; set; } 
} 

我想抓住所有包含某個DataInfo的DataGroups。

該查詢SQLite中管理員的工作,所以我想我的數據庫是正確設置:

select * from DataGroupInfo 
INNER JOIN DataInfoToDataGroupInfo ON 
DataGroupInfo.Id == DataInfoToDataGroupInfo.DataGroupInfo_id 
where 
DataInfoToDataGroupInfo.DataInfo_id == 3 

我暴露中的LINQ這兩種方式的倉庫

public IQueryable<T> Find<T>() 
{ 
    return session.Linq<T>(); 
} 

public IQueryable<T> Find<T>(Expression<Func<T, bool>> predicate) 
{ 
    return Find<T>().Where(predicate); 
} 

我用像庫這

static public List<DataGroupInfo> GetAllWithData(Int32 dataID) 
    { 
     using (var db = new DBRepository()) 
     { 
      //var items = (from g in db.Find<DataGroupInfo>() 
      //    where (from d in g.data where d.Id == dataID select d).Count() > 0 
      //    select g).ToList(); 

      var items = db.Find<DataGroupInfo>(dg => dg.data.Where(d => d.Id == dataID).Count() > 0).ToList(); 

      return items; 
     } 
    } 

當Linq嘗試執行上面我在eith下得到以下錯誤呃方法:

NHibernate.QueryException是 未處理由用戶代碼
消息= 「無法解析屬性: data.Id的: MapLarge.Public.Data.DataGroupInfo」
源= 「NHibernate的」堆棧跟蹤: 在NHibernate.Persister.Entity.AbstractPropertyMapping.GetColumns(字符串 propertyName的)

我在做什麼錯?

---- -----更新

此解決給出了預期的結果,但它的蠻力方法每拉成DATAGROUP內存中,然後使用C#,而不是數據庫過濾的對象..但至少它將我的問題縮小到一個NHibernate特定的問題。

 var step1 = db.Find<DataGroupInfo>().ToList(); 
     var items = step1.Where(dg => dg.data.Where(d => d.Id == dataID).Count() > 0).ToList(); 

我還是很喜歡的答案,如果有人在那裏:-)

+1

什麼是你DataInfoToDataGroupInfo查表喜歡?當鏈接表包含除兩個外鍵以外的列時,我遇到了Automapper加入多對多的問題。 – 2010-02-27 00:40:20

+0

DataInfoToDataGroupInfo只有兩個外鍵,而整個數據庫實際上是由Nhibernate AutoMapper創建的,所以我認爲它應該是穩定的,如果我的類定義符合NHibernate Automapper約定。 下面是SQLite的管理員顯示錶的屬性,當我檢查外部: ColumnInfoToColumnGroupInfo ColumnGroupInfo_id INTEGER NOT NULL ColumnInfo_id INTEGER NOT NULL 這裏的AUTOGEN代碼: VAR NEWDB =新的SchemaExport(配置).Create(真,真); – Glenn 2010-02-28 21:06:44

+0

我知道NHibernate的Linq是相當新的,也許這是一個錯誤或不支持的查詢類型? – Glenn 2010-02-28 21:10:29

回答

2

LINQ到NHibernate的目前不支持子查詢或連接:http://ayende.com/Blog/archive/2009/07/26/nhibernate-linq-1.0-released.aspx

+0

謝謝。我想我記得那樣的限制,但不知道自去年夏天以來這個限制是否發生了變化。很好,當這個功能的作品。 – Glenn 2010-03-02 14:13:19

+0

我知道他們一直在試圖支持所有的101 Linq示例。 http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx 如果Ayende的博客或NHibernate Wiki保留101個樣本列表中支持和不支持的Linq樣本的列表,那將是很酷的。我認爲他已經爲他的單元測試中的每一個都進行了測試。 – Glenn 2010-03-02 14:20:51

相關問題