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"));
});
当然我的实际类型要复杂得多,需要组件映射中的用户类型。但这现在运作良好。
如果您想查询用户类型的一部分,我想您想看看使用组件映射而不是用户类型。
我在让 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"));
});
当然我的实际类型要复杂得多,需要组件映射中的用户类型。但这现在运作良好。
如果您想查询用户类型的一部分,我想您想看看使用组件映射而不是用户类型。