Поиск по столбцу типа пользователя в 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();
Другие вопросы по тегам