NHibernate Subquery Linq - Как выбрать группы, которые содержат определенный элемент по идентификатору - PullRequest
1 голос
/ 25 февраля 2010

Короткая версия Этот запрос работает в базе данных, но не работает с 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; }
}

Я хочу получить все группы данных, которые содержат определенную информацию.

Этот запрос работает в администраторе 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 было не обрабатывается кодом пользователя
Сообщение = "не удалось разрешить свойство: data.Id of: MapLarge.Public.Data.DataGroupInfo "
Source = "NHibernate" StackTrace: в NHibernate.Persister.Entity.AbstractPropertyMapping.GetColumns (String ИмениСвойства)

Что я делаю не так?

---- Обновление -----

Это обходной путь дает ожидаемый результат, но это метод грубой силы, тянущий каждую группу данных в память и затем фильтрующий объекты с использованием c #, а не базы данных ... но, по крайней мере, он сужает мою проблему до специфической проблемы NHibernate.

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

Я бы по-прежнему очень любил бы ответ, если кто-нибудь там есть

1 Ответ

2 голосов
/ 02 марта 2010

LINQ-to-NHibernate в настоящее время не поддерживает подзапросы или объединения: http://ayende.com/Blog/archive/2009/07/26/nhibernate-linq-1.0-released.aspx

...