2010-06-29 53 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