0

在這樣的(http://alanstorm.com/2009/img/magento-book/eav.png)數據模型,我想使用LINQ to SQL從EAV_Attribute值獲取價值。EAV - 使用LINQ to實體

enter image description here

假設一個EAV_Attribute只在一個繼承表(VARCHAR,十進制,整型,等等)我怎樣才能得到它在LINQ查詢存在?

我知道,我可以使用繼承這一點,但我想在SQL數據庫端執行它...

是否有可能做的一種凝聚Linq中的,考慮到要素有不同種類?

+0

假設您使用C#構建LINQ to SQL查詢,可以將空coalesce運算符(??)與外連接一起使用。試一試! –

+0

我已經試過了,但是我不能這樣做,因爲「Value」屬性在每個表中都有不同的數據類型。 –

+0

相關:http://stackoverflow.com/a/13673607 –

回答

0

EAV和linq不是美滿的婚姻。我認爲你最好的辦法是在eav_attribute中創建一個未映射的屬性,它可以從它的鍵入的屬性子項中解析值(如object)。對於實體框架,您將無法在表達式中使用此屬性(即不在WhereSelect中)。必須先轉換爲IEnumerable才能訪問它。 (Linq-to-sql可能會允許它,因爲它可以切換到引擎蓋下的linq-to-objects)。

另一個選擇是創建,做同樣的sql_variant類型的計算的列,但現在在T-SQL代碼。但是...... EF不支持sql_variant。你必須使用some trickery來閱讀它。

這是閱讀部分。

設置/修改/刪除值我看不出任何捷徑。您只需將對象作爲父母和子女的任何對象圖處理即可。在sql server中,你不能使用級聯刪除,因爲它只能被定義爲一個外鍵。 (This可能會解決這個問題,但我從未嘗試過)。

所以,恐怕不是真正的好消息。也許很高興知道,在一個項目中,我也使用一個具有不可避免的EAV部分的數據庫。我們也用EF來做,但這並非沒有摩擦。

0

首先,我建議使用TPH而不是TPT作爲EAV表格。 (一個表具有多個空值的列(每個類型之一)+鑑別器對每類型一個表。)

無論哪種方式,如果建模的值實體作爲一個抽象類(含有兩個ID)與繼承實體每次,增加值的屬性值的數據類型,那麼你的LINQ應該是這樣的:

var valueEntity = context.ProductAttributes.Where(pa => 
     pa.ProductId == selectedProductId 
     && pa.AttributeTypeId == selectedAttributeTypeId) 
    .SingleOrDefault() as ProductAttributeOfDouble; 

if valueEntity != null 
    return valueEntity.Value; 

return null; 

凡實體類型是:產品,屬性類型,ProductAttribute,ProductAttributeOfDouble,... ProductAttributeOfString。