2010-06-29 44 views
1

存储和映射包含一组Integer作为其属性之一的实体的最佳方式是什么?我在Sql Server 2005上使用nHibernate。用nHibernate在Sql Server 2005中存储一组整数值?

创建一个CLR自定义类型在这里会有帮助吗?如果是的话,它如何使用nHibernate进行映射?

我应该可以在Set上查询。例如。

select myEntity from MyEntities where myEntity.Integers = SetOf(2, 4, 5) 
+0

“它的一个属性”:你的意思是字段或属性? “CLR自定义类型”是什么意思? – 2010-06-29 11:12:58

+0

@Stefan:我的意思是属性。 CLR已内置到Sql Server 2005中,我们可以创建自定义类型 – Amitabh 2010-06-29 11:15:18

+0

当您使用NHibernate时,我通常会坚持使用NHibernate特性,这使得您可以更加独立于Sql Server并降低开发成本。有NHibernate的用户类型,但他们没有在这里使用。这个问题听起来很基本,除非我错过了一些东西。 **编辑:**在对我的问题的评论中,我看到你需要特定的查询。将它们添加到问题中,是至关重要的。 – 2010-06-29 11:21:29

回答

2

假设该类

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用户类型实现。

+0

这是一种方式,但我也需要能够在Set上查询。喜欢哪里MyEntity.Integers == SetOf(2,3,5) – Amitabh 2010-06-29 11:18:24

+0

这是一个不同的问题。您无法为任何查询创建最佳映射。您需要告诉我您需要在这些数据结构上执行哪种查询。 – 2010-06-29 11:23:44