我很难让nHibernate在一个用IUserType实现映射的字段上执行where子句。以下所有类型都针对该问题进行了简化。
我有一张看起来像这样的表:
int id
nvarchar notPartOfUserType
nvarchar partOfUserType1
nvarchar partOfUserType2
nvarchar partOfUserType3
...
这被映射到一个对象
int Id
string NotUserType
UserType UserType
...
和UserType看起来像
string Part1
string Part2
string Part3
...
通过在UserTypeMapping中实现IUserType,将partOfUserType1,partOfUserType2和partOfUserType3映射为从db中进入UserType。这是该类的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>();
});
我的常规获取和保存/更新工作正常。我也可以通过以下方式对不属于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"));
});
当然,我的实际类型要复杂得多,需要在组件映射中使用用户类型。但现在效果很好。
答案 0 :(得分:0)
如果你想查询usertype的部分内容,我想你想看一下使用Component mapping而不是用户类型。