2011-08-11 16 views
8

इसNHibernate कुशल LINQ का उपयोग कर हटाएँ कहाँ हालत

var q = from x in SomeIQueryable<SomeEntity> where x.A1 == a1 && x.B1 == b1 select x; 

तरह LINQ प्रश्नों के साथ NHibernate के लिए भंडार होने वहाँ एक समाधान है कि कैसे इस कहां फिल्टर हो और "एक शॉट हटाना रद्द करें" जो लगता है के लिए लागू करने के लिए है HQL के माध्यम से ही संभव हो सकता है:

var cmd = string.Format("delete from SomeEntity where x.A1 = '{0}' and x.B1 = {1}", a1, b1); 
session.CreateQuery(cmd).ExecuteUpdate(); 

उत्तर

6

राष्ट्रीय राजमार्ग LINQ प्रदाता और मापदंड/queryover एपीआई सशर्त हटाए गए/अद्यतन का समर्थन नहीं करते। एचक्यूएल या कच्चे एसक्यूएल एकमात्र विकल्प हैं जब तक कि आप एनएचबीर्नेट को विस्तारित नहीं कर रहे हैं।

0
(from x in NHSession.Query<SomeEntity>() 
        where x.A1 == a1 && x.B1 == b1 
        select x).ForEach(y => { NHSession.Delete(y) }); 
     NHSession.Flush(); 
+1

कुछ स्पष्टीकरण पोस्ट करें; कोड-केवल उत्तर बहुत कुछ नहीं कहते हैं। – rgettman

+0

इसके साथ समस्या यह है कि यह सभी इकाइयों को बस उन्हें हटाने के तरीके पर लोड करता है। –

+0

यह वह नहीं है जिसे हम कुशल कहते हैं – Beatles1692

1

वर्तमान में, एनएच 4.0.1 के रूप में, यह संभव नहीं है। हालांकि, जिरा में एक खुला मुद्दा है (एनएच -365 9, https://nhibernate.jira.com/browse/NH-3659)। http://weblogs.asp.net/ricardoperes/strongly-typed-delete-with-nhibernate पर वर्णित एक कस्टम इंटरसेप्टर और एसक्यूएल प्रतिस्थापन के आधार पर एक हैकिश समाधान है, लेकिन मैं एक स्वच्छ समाधान पर काम कर रहा हूं और अंत में एक पुल अनुरोध सबमिट करूंगा।

+0

मैं यह कहना भूल गया कि मैं एनएच -3659 पर काम कर रहा हूं, लेकिन अभी तक दिखाने के लिए कुछ भी नहीं है। इस पोस्ट में उल्लिखित कुछ विकल्प हैं: https://weblogs.asp.net/ricardoperes/deleting-entities-in-nhibernate (अस्वीकरण: मेरा अपना) –

+0

मैंने एनएच -3659 के लिए पुल अनुरोध सबमिट किया है - मजबूत टाइप किया गया हटाएँ। लिंक https://nhibernate.jira.com/browse/NH-3659 पर उपलब्ध है। –

0

अब यह Nhibernate 5.0 के साथ संभव है:

session.Query<SomeIQueryable>() 
      .Where(x => x.A1 == a1 && x.B1 == b1) 
      .Delete(); 

प्रलेखन:

// 
    // Summary: 
    //  Delete all entities selected by the specified query. The delete operation is 
    //  performed in the database without reading the entities out of it. 
    // 
    // Parameters: 
    // source: 
    //  The query matching the entities to delete. 
    // 
    // Type parameters: 
    // TSource: 
    //  The type of the elements of source. 
    // 
    // Returns: 
    //  The number of deleted entities. 
    public static int Delete<TSource>(this IQueryable<TSource> source); 
संबंधित मुद्दे