短版 此查询在数据库中有效,但在Linq To NHibernate中失败。为什么呢?
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映射的对象与ManyToMany关系。
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的所有DataGroup。
此查询适用于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尝试执行上面的任何一种方法时,我得到以下错误:
NHibernate.QueryException是 未按用户代码处理
Message =“无法解析属性: data.Id: MapLarge.Public.Data.DataGroupInfo“
Source =“NHibernate”StackTrace: 在NHibernate.Persister.Entity.AbstractPropertyMapping.GetColumns(String propertyName的)
我做错了什么?
---- -----更新
这个解决方案给出了预期的结果,但它是一种强力方法,将每个数据组拉入内存,然后使用c#而不是数据库过滤对象..但至少它将我的问题缩小到NHibernate特定问题。
var step1 = db.Find<DataGroupInfo>().ToList();
var items = step1.Where(dg => dg.data.Where(d => d.Id == dataID).Count() > 0).ToList();
如果有人在场,我仍然真的很喜欢答案: - )
答案 0 :(得分:2)
LINQ-to-NHibernate目前不支持子查询或连接:http://ayende.com/Blog/archive/2009/07/26/nhibernate-linq-1.0-released.aspx