存储和映射包含一组Integer作为其属性之一的实体的最佳方式是什么?我在Sql Server 2005上使用nHibernate。用nHibernate在Sql Server 2005中存储一组整数值?
创建一个CLR自定义类型在这里会有帮助吗?如果是的话,它如何使用nHibernate进行映射?
我应该可以在Set上查询。例如。
select myEntity from MyEntities where myEntity.Integers = SetOf(2, 4, 5)
存储和映射包含一组Integer作为其属性之一的实体的最佳方式是什么?我在Sql Server 2005上使用nHibernate。用nHibernate在Sql Server 2005中存储一组整数值?
创建一个CLR自定义类型在这里会有帮助吗?如果是的话,它如何使用nHibernate进行映射?
我应该可以在Set上查询。例如。
select myEntity from MyEntities where myEntity.Integers = SetOf(2, 4, 5)
假设该类
class MyEntity
{
//...
public IList<int> Integers { get; private set; }
}
只要将它映射为一组。
<class name="MyEntity">
<!-- ... -->
<set name="Integers" table="MyEntity_Integers">
<key column="MyEntity_FK"/>
<element type="Int32" column="Value"/>
</set>
</class>
你可以尝试通过过滤收集:
from MyEntity e
where e.Integers in (:set)
and size(e.Integers) = :setSize
这可能不是非常快。
一种完全不同的方法:将某些序列化形式的整数存储到单个文本字段中。
你可以编写自己的NHibernate自定义类型。在存储之前对整数进行排序。你可以用"2;45;78;898"
这样的格式存储它们。过滤将非常快,因为它只是匹配字符串。更改数据库中的集合可能会变得很困难。另一个问题是色谱柱长度有限。
Here is an example NHibernate用户类型实现。
这是一种方式,但我也需要能够在Set上查询。喜欢哪里MyEntity.Integers == SetOf(2,3,5) – Amitabh 2010-06-29 11:18:24
这是一个不同的问题。您无法为任何查询创建最佳映射。您需要告诉我您需要在这些数据结构上执行哪种查询。 – 2010-06-29 11:23:44
“它的一个属性”:你的意思是字段或属性? “CLR自定义类型”是什么意思? – 2010-06-29 11:12:58
@Stefan:我的意思是属性。 CLR已内置到Sql Server 2005中,我们可以创建自定义类型 – Amitabh 2010-06-29 11:15:18
当您使用NHibernate时,我通常会坚持使用NHibernate特性,这使得您可以更加独立于Sql Server并降低开发成本。有NHibernate的用户类型,但他们没有在这里使用。这个问题听起来很基本,除非我错过了一些东西。 **编辑:**在对我的问题的评论中,我看到你需要特定的查询。将它们添加到问题中,是至关重要的。 – 2010-06-29 11:21:29