投影使用自定义用户类型的列

时间:2012-02-13 18:41:08

标签: nhibernate queryover iusertype

我在我的State列中使用自定义用户类型,但遗憾的是,如果我将此列投影到dto,我会收到System.InvalidCastException : Specified cast is not valid.的异常。

我的查询是

Item itemAlias = null;
Dto dtoAlias = null;

var l = Session.QueryOver(() => itemAlias)
    .SelectList(x => x
        .Select(xx => xx.Id).WithAlias(() => dtoAlias.Id)
        .Select(xx => xx.State).WithAlias(() => dtoAlias.State))
    .Where(x => x.State == States.FirstState)
    .TransformUsing(Transformers.AliasToBean<Dto>())
    .List<Dto>();

我的用户类型代码是

public class States : ReadOnlyCollection<State>
{
    public static State FirstState = new State(0, "First State");
    public static State SecondState = new State(1, "Second State");

    public States() 
        : base(new [] { FirstState, SecondState })
    {
    }

    public static IEnumerable<State> GetAll()
    {
        return new States();
    }
}

public class StateUserType : GenericWellKnownInstanceType<State, int>
{
    public StateUserType()
        : base(new States(), 
            (entity, id) => entity.Id == id, 
            entity => entity.Id)
    {
    }

    public override SqlType[] SqlTypes
    {
        get { return new[] { SqlTypeFactory.Int16 }; }
    }
}

我的Item班级地图是

public class ItemMap : ClassMap<Item>
{
    public ItemMap()
    {
        Id(x => x.Id);

        Map(x => x.State)
            .CustomType<StateUserType>()
            .Not.Nullable();
    }
}

我的dto是

public class Dto
{
    public int Id { get; set; }
    public State State { get; set; }
}

GenericWellKnownInstanceType来自here。如果我没有投射任何值,我的用户类型将按预期工作。我使用的是NHibernate 3.2。

解决方案

我似乎解决了这个问题。

GenericWellKnownInstanceType的第73行(找到here

替换

var value = (TId)rs.GetValue(index0);

var value = (TId)Convert.ChangeType(rs.GetValue(index0), typeof(TId));

我会看到发送补丁。

0 个答案:

没有答案