Короткая версия
Этот запрос работает в базе данных, но не работает с 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();
Я бы по-прежнему очень любил бы ответ, если кто-нибудь там есть