NHibernate 用户类型在哪里

NHibernate Where in with a User Type

我在让 nHibernate 对用 IUserType 实现映射的字段执行 where in 子句时遇到了很多麻烦。以下所有类型都针对该问题进行了简化。

我有一个看起来像这样的 table :

int id
nvarchar notPartOfUserType
nvarchar partOfUserType1
nvarchar partOfUserType2
nvarchar partOfUserType3
...

这被映射到一个对象

int Id
string NotUserType
UserType UserType
...

而 UserType 看起来像

string Part1
string Part2
string Part3
...

partOfUserType1、partOfUserType2 和 partOfUserType3 通过在 UserTypeMapping 中实现 IUserType 被映射为从数据库中出来成为 UserType。这是 class 的 NullSafeGet。没那么复杂。

        public object NullSafeGet(IDataReader rs, string[] names, object owner)
    {
        var field1 = NHibernateUtil.String.NullSafeGet(rs, names[0]) as string;
        var field2 = NHibernateUtil.String.NullSafeGet(rs, names[1]) as string;
        var field3 = NHibernateUtil.String.NullSafeGet(rs, names[2]) as string;

        return new UserType
        {
            Part1 = field1
            Part2 = field2,
            Part3 = field3
        };
    }

这是由代码映射的。这是 属性

的摘录
        Property(p => p.UserType, map =>
        {
            map.Columns(m => m.Part1("partOfUserType1"), m => m.Part2("partOfUserType2"), m => m.Part3("partOfUserType3"));
            map.Type<UserTypeMapping>();
        });

我所有的常规获取和 saves/updates 工作正常。我还可以通过以下方式对不属于 UserType 的字段执行 Where In 子句:

var list = new List<string> {"123", "456"};
var result = session.Query<MyType>().Where(row => list.Contains(row.NotUserType)).ToList();

但是,问题是:我想在 partOfUserType1 字段上做一个 where in 子句。我这辈子都做不到。我已经尝试了所有我能想到的使用 Linq 提供程序和 QueryOver 语法的方法。没有骰子。

这可能吗?

编辑 - 解决方案

感谢 Oskar Berggren 引导我找到这个答案。 在这种情况下,我应该使用组件映射而不是用户类型。

之前

Property(p => p.UserType, map =>
{
    map.Columns(m => m.Part1("partOfUserType1"), m => m.Part2("partOfUserType2"), m => m.Part3("partOfUserType3"));
    map.Type<UserTypeMapping>();
});

之后

Component(c => c.UserType, component =>
{
    component.Property(p => p.Part1, map => map.Column("partOfUserType1"));
    component.Property(p => p.Part2, map => map.Column("partOfUserType2"));
    component.Property(p => p.Part3, map => map.Column("partOfUserType3"));
});   

当然我的实际类型要复杂得多,需要组件映射中的用户类型。但这现在运作良好。

如果您想查询用户类型的一部分,我想您想看看使用组件映射而不是用户类型。