1

短版 此查询在数据库中有效,但在 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="could not resolve property: data.Id of: MapLarge.Public.Data.DataGroupInfo"
Source="NHibernate" StackTrace: at 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();

如果有人在那里,我仍然非常喜欢答案:-)

4

1 回答 1

2

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

于 2010-03-02T09:09:14.423 回答