2011-01-20 13 views
5

में विभिन्न तालिकाओं के आधार पर मूल्य निर्धारित करना मैं एनएचबर्ननेट का उपयोग कर रहा हूं, और इस क्वेरी के साथ समस्याएं हैं ... मेरे पास एक क्लास आइटम है जिसे मैं अपने आईडी का उपयोग करना चाहता हूं। सब ठीक। हालांकि, मैं कुछ अन्य शर्त निर्धारित होने पर भी आइटम वर्ग पर एक बूल संपत्ति को सत्य पर सेट करना चाहता हूं। विशेष रूप से इस संपत्ति का नाम IsMarked है, यह बताता है कि आइटम को चिह्नित करने वाले उपयोगकर्ता के लिए चिह्नित/डर/ध्वजांकित किया गया है, और यह जानकारी आइटम और उपयोगकर्ता के बीच संबंध देने वाली तालिका पर सेट की गई है।NHibernate क्वेरी

वर्तमान में मैं आइटम ला रहा हूं, और उसके बाद संदर्भ ढूंढ रहा हूं - यदि संदर्भ पाया जा सकता है तो संपत्ति को सत्य में अपडेट करना। क्या मैं इसे एक प्रश्न में कर सकता हूं?

var item = Session.Get<Item>(itemId); 

var flaggedResult = Session.CreateCriteria<ItemWithUserFlag>() 
    .Add(Restrictions.Eq("User.Id", userId)) 
    .Add(Restrictions.Eq("Item", item)) 
    .List<ItemWithUserFlag>(); 

if (flaggedResult.Count > 0) 
    item.IsMarked = true; 

return item; 
+0

अपनी कक्षाओं कैसे मैप की जाती हैं? क्या उपयोगकर्ता और आइटम के बीच कई से अधिक रिलीज हैं? –

+0

मै मैपिंग के लिए फ्लुएंट का उपयोग कर रहा हूं। एक अलग वर्ग ItemWithUserFlag में प्रतिनिधित्व करने वाले कई से अधिक संबंध हैं। उपयोगकर्ता के पास आइटम से सीधा संबंध नहीं है, और आइटम के पास उपयोगकर्ता से सीधा संबंध नहीं है। ItemWithUserFlag में उपयोगकर्ता और आइटम पर एक संदर्भ सेट है। – stiank81

उत्तर

7

कैसे अपनी संपत्ति मानचित्रण में filter के साथ formula उपयोग के बारे में:

<property name="IsMarked" formula="(select count(*) from ItemWithUserFlag where ItemWithUserFlag.ItemId = ItemId and ItemWithUserFlag.UserId = :UserFilter.userId)" /> 

और डीईएफ़ फिल्टर करें:

<filter-def name="UserFilter"> 
    <filter-param name="userId" type="Int32"/> 
</filter-def> 

ऐसा ही कुछ में परिणाम होगा

SELECT Item.*, (select count(*) from ItemWithUserFlag where ItemWithUserFlag.ItemId = Item.ItemId and ItemWithUserFlag.UserId = ?) AS IsMarked FROM Item 

जब तक IsMarked को bool के रूप में परिभाषित किया गया है, तो count(*)0 लौटाता है तो इसे false में परिवर्तित कर दिया जाएगा और यदि > 0 कुछ भी true में परिवर्तित हो जाएगा।

संपादित करें: Fluent प्रतिनिधित्व

public class ItemMap : ClassMap<Item> 
{ 
    public ItemMap() 
    { 
     /// ... whatever 
     Map(x => x.IsMarked).Formula("(select count(*) from ItemWithUserFlag where ItemWithUserFlag.ItemId = ItemId and ItemWithUserFlag.UserId = :UserFilter.userId)"); 
    } 
} 

public class UserFilter : FilterDefinition 
{ 
    public UserFilter() 
    { 
     WithName("UserFilter") 
      .AddParameter("userId", NHibernate.NHibernateUtil.Int32); 
    } 
} 
+0

Thx! अभी तक परीक्षण नहीं किया है, लेकिन ऐसा लगता है कि यह काम करेगा। मेरे मामले में समस्या यह है कि मैं मैपिंग के लिए FluentNhibernate का उपयोग करता हूं। डुनो अगर मैं कुछ मैपिंग्स को एक ही समय में एक्सएमएल परिभाषित कर सकता हूं, या यदि फ्लुएंट में इसे व्यक्त किया जा सकता है। तो, इस सवाल में सीधे इसे प्राप्त करने का कोई तरीका नहीं है? – stiank81

+0

@ stiank81 मैंने जोड़ा जो मुझे विश्वास है कि फ्लुएंट के साथ काम करना चाहिए। –

+0

@ stiank81 प्रश्न में इसे प्राप्त करने के बारे में: मेरा मानना ​​है कि कोई रास्ता नहीं है। तर्कसंगत रूप से, आप जो चाहते हैं वह प्रतिबंध नहीं है या क्या, लेकिन एक गणना कॉलम है, इसलिए मुझे लगता है कि यह मैपिंग के माध्यम से किया जाना चाहिए। लेकिन, मैं nHibernate पर ऐसा विशेषज्ञ नहीं हूं और इस प्रकार मैं आपको निश्चित रूप से नहीं बता सकता। संपादन के लिए –