Поиск по столбцу типа пользователя в nhibernate
У меня есть сущность User
который содержит свойство Status
типа DictionaryItem
и это отображается как UserType
, Теперь я хочу сделать следующее заявление linq:
Session.Query<User>().Where(x => x.LoginStatus.Code == "").ToList();
Я получил следующее исключение:
Дополнительная информация: не удалось разрешить свойство: Код: Пользователь
Я знаю, что проблема в том, что я ищу с использованием моего пользовательского типа (код свойства существовал на моем DictionaryItem
тип пользователя). Запрос сеанса nhibernate генерирует оператор SQL при вызове ToList()
, но LoginStatus
не является ссылочным типом, только User
типа, есть ли обходной путь, чтобы сделать запрос на тип пользователя?
Редактировать 1: ниже исходного кода:
public class User
{
public virtual Guid Id { get; set; }
public virtual DictionaryItem LoginStatus { get; set; }
public User()
{
}
}
public class UserMap : ClassMap<User>
{
public UserMap()
{
Id(x => x.Id);
Map(x => x.LoginStatus).CustomType<DictionaryItemCustomType>();
}
}
public class DictionaryItem
{
public virtual int Id { get; set; }
public virtual string Code { get; set; }
public virtual string Description { get; set; }
}
public class DictionaryItemCustomType : IUserType
{
public new bool Equals(object x, object y)
{
if (x == null && y == null)
{
return true;
}
if (x == null || y == null)
{
return false;
}
return ((DictionaryItem)x).Id == ((DictionaryItem)y).Id;
}
public int GetHashCode(object x)
{
return x.GetHashCode();
}
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
object value = NHibernateUtil.Int32.NullSafeGet(rs, names);
if (value == null)
{
return null;
}
return AutofacServiceHostFactory.Container.Resolve<IDictionaryRepository>().DictionaryItems.First(x => x.Id == (int)value);
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
DictionaryItem dictionaryItem = value as DictionaryItem;
NHibernateUtil.Int32.NullSafeSet(cmd, dictionaryItem == null ? (object)null : dictionaryItem.Id, index);
}
public object DeepCopy(object value)
{
return value;
}
public object Replace(object original, object target, object owner)
{
return DeepCopy(original);
}
public object Assemble(object cached, object owner)
{
throw new NotImplementedException();
}
public object Disassemble(object value)
{
throw new NotImplementedException();
}
public SqlType[] SqlTypes
{
get { return new[] { NHibernateUtil.Int32.SqlType }; }
}
public Type ReturnedType
{
get { return typeof(DictionaryItem); }
}
public bool IsMutable
{
get { return false; }
}
}
Бд выглядит так:
CREATE TABLE [dbo].[User](
[Id] [uniqueidentifier] NOT NULL,
[LoginStatusId] [int] NOT NULL
)
CREATE TABLE [dbo].[DictionaryItem](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Code] [nvarchar](20) NOT NULL,
[Description] [nvarchar](200) NOT NULL,
)
2 ответа
Попробуй это:
DictionaryItem statusAlias = null;
User userAlias = null;
return Session.QueryOver<User>(() => userAlias)
.JoinAlias(() => userAlias.LoginStatus, () => statusAlias)
.Where(() => statusAlias.Code == "")
.ToList();
Ваше отображение неверно. DictionaryItem не должен отображаться как пользовательский тип. Это похоже на другую сущность для меня.
Map(x => x.LoginStatus).CustomType<DictionaryItemCustomType>();
Выше указано, что вы хотите отобразить только один столбец. Вы хотите сопоставить фактическую сущность DictionaryItem с пользователем. Вам нужно сделать что-то вроде этого:
References(x => x.LoginStatus, "LoginStatusId");
Затем вам нужно сопоставить DictionaryItem:
public class DictionaryItemMap : ClassMap<DictionaryItem>
{
public DictionaryItemMap()
{
Id(x => x.Id); //You'll need to do something else here for identity columns
Map(x => x.Code);
Map(x => x.Description);
}
}
После того, как у вас есть это отображение, вы можете выполнить MGA запрос, упомянутый выше.
LoginStatus statusAlias = null;
User userAlias = null;
return Session.QueryOver<User>(() => userAlias)
.JoinAlias(() => userAlias.LoginStatus, () => statusAlias)
.Where(() => statusAlias.Code == "")
.ToList();