短版 該查詢工作在數據庫中,但無法使用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();
我還是很喜歡的答案,如果有人在那裏:-)
什麼是你DataInfoToDataGroupInfo查表喜歡?當鏈接表包含除兩個外鍵以外的列時,我遇到了Automapper加入多對多的問題。 – 2010-02-27 00:40:20
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
我知道NHibernate的Linq是相當新的,也許這是一個錯誤或不支持的查詢類型? – Glenn 2010-02-28 21:10:29