2010-08-19 23 views
19

के साथ ऑब्जेक्ट लोड किए बिना डेटाबेस में ऑब्जेक्ट मौजूद है या नहीं, क्या एनबीबर्ननेट में कोई ऑब्जेक्ट है कि ऑब्जेक्ट प्राप्त करने/लोड किए बिना डेटाबेस में कोई ऑब्जेक्ट मौजूद है या नहीं?जांचें कि क्या एनएचबीरनेट

+0

मुझे समझ नहीं आता है। यदि डीबी में कोई ऑब्जेक्ट नहीं है, तो ऑब्जेक्ट कैसे प्राप्त या लोड हो रहा है। वस्तु वापस शून्य के रूप में वापस आना चाहिए। या आपकी परिणाम सूची खाली हो जाएगी। –

उत्तर

9

हमेशा एक गिनती कर सकता है।

मैं DetachedCriteria का उपयोग करते हैं, तो मैं कुछ इस तरह होगा: आप निम्नलिखित 3 प्रश्नों में से एक (इस्तेमाल कर सकते हैं

var criteria = // some criteria that will identify your object 

var result = criteria 
    .GetExecutableCriteria(Session) 
    .SetProjection(Projections.RowCountInt64()) 
    .UniqueResult(); 

return result > 0; 
3

मुझे लगता है कि आप इस के लिए देख रहे हैं ...

var fooExists = session.Query<Foo>().Any(f => /*condition*/); 
+0

यह var fooExists = session.Query () होना चाहिए। कोई भी (f =>/* शर्त * /) अनावश्यक कहां है। यह बुरा विचार है क्योंकि कोई भी सभी कॉलम (पूर्ण इकाई) वापस कर देगा। –

+0

@DariusKucinskas जो सही नहीं है। दोनों का परिणाम सटीक एसक्यूएल में होता है। 'जहां (x) के बजाय' Any (x) 'का उपयोग करना .अन्य()' बस थोड़ा क्लीनर है। –

+0

कोई भी बुरा है क्योंकि यह इकाई फॉर्म डेटाबेस प्राप्त करता है, इस स्थिति में पंक्ति गणना बेहतर है। –

2
var exists = 1 == session.CreateQuery("select 1 from MyEntity where Property = :value") 
    .SetValue("value", xxx) 
    .UniqueResult<Int32?>(); 
28

या आप से मानदंड एपीआई Projections.RowCountInt64() इस्तेमाल कर सकते हैं डेविड उत्तर):

bool exist = session.Query<Employee>() 
    .Any(x => x.EmployeeID == 1); 

bool exist = session.QueryOver<Employee>() 
    .Where(x => x.EmployeeID == 1) 
    .RowCount() > 0; 

bool exist = session.Query<Employee>() 
    .Count(x => x.EmployeeID == 1) > 0; 

बस ध्यान रखें कि इनमें से कोई भी तीनों में से सबसे खराब है क्योंकि यह इकाई प्राप्त करता है।

exec sp_executesql N'select TOP (1) employee0_.EmployeeID as EmployeeID0_, employee0_.Name as Name0_ from Employee employee0_ where [email protected]',N'@p0 int',@p0=1 

exec sp_executesql N'SELECT count(*) as y0_ FROM Employee this_ WHERE this_.EmployeeID = @p0',N'@p0 int',@p0=1 

exec sp_executesql N'select cast(count(*) as INT) as col_0_0_ from Employee employee0_ where [email protected]',N'@p0 int',@p0=1 
+9

ओटीओएच, किसी भी प्रदर्शन परिप्रेक्ष्य से सबसे अच्छा हो सकता है - डेटा गणना, इंडेक्स और इसी तरह के आधार पर, "गिनती" कॉल करने के लिए एक भारी कर्तव्य कार्य हो सकता है। एक टॉप (1) सिर्फ उचित सूचकांक की तलाश करेगा। क्या टेबल से 'SELECT TOP (1) 1 के बराबर है ...' जो फिर से सबसे अच्छा होगा (क्योंकि यह वास्तव में तालिका से कोई डेटा नहीं खींचता)। विस्तृत ब्रेकडाउन के लिए –

+1

+1। – JasonCoder

+0

एक प्रश्न के लिए मेरा उत्तर देखें जो इकाई को प्राप्त नहीं करता है या गणना का उपयोग नहीं करता है। http://stackoverflow.com/a/24083783/12752 –

5

Darius Kucinskas 'उत्कृष्ट जवाब पर विस्तार करने के लिए, आप का चयन का उपयोग कर इकाई प्राप्त करने में कठिनाई से बचने कर सकते हैं:: यहाँ एसक्यूएल प्रत्येक के लिए उत्पन्न क्वेरी है

bool exist = session.Query<Employee>() 
        .Where(x => x.EmployeeID == 1) 
        .Select(x => x.EmployeeID) 
        .Any(); 

के रूप में उल्लेख किया है, क्वेरी प्रदर्शन ही होना चाहिए हालांकि मैं नेटवर्क ट्रैफिक को कम करने की अपेक्षा करता हूं।

0

Ricardo उत्तर के आधार पर, यह जांचने के लिए सबसे प्रभावी तरीका लगता है कि वस्तु HQL का उपयोग कर मौजूद है या नहीं।इसकी गिनती नहीं करता है और अनावश्यक रूप से वस्तु लोड नहीं करता है:

var exists = session 
    .CreateQuery("select 1 from Widget where _color = 'green'") 
    .SetMaxResults(1) 
    .UniqueResult<Int32?>() 
    .HasValue; 

यह इस एसक्यूएल (ध्यान दें कि यह SQLite है, इसलिए टॉप के बजाय सीमित)

select 
    1 as col_0_0_ 
from 
    Widgets 
where 
    Color='green' limit 1; 
0

आप एक कोशिश कर सकते हैं उत्पन्न करता है :

public virtual T FindById<T>(int id) 
{ 
    return session.Get(typeof(T), id)); 
} 
8

तो मैं अपने आप को अपने उदाहरण के साथ कुछ परीक्षण करने के लिए करते हैं @Jamie Ide @Darius Kucinskas @Dmitry

enter image description here

तो:

var exists = session 
.CreateQuery("select 1 from Widget where _color = 'green'") 
.SetMaxResults(1) 
.UniqueResult<Int32?>() 
.HasValue; 
मेरे मामले में

18% तेजी से

bool exist = session.Query<Employee>() 
    .Any(x => x.EmployeeID == 1); 

14% से

bool exist = session.Query<Employee>() 
    .Count(x => x.EmployeeID == 1) > 0; 

और 8% थी

bool exist = session.QueryOver<Employee>() 
    .Where(x => x.EmployeeID == 1) 
    .RowCount() > 0; 

तो मेरी राय में भले ही कठिन कोडित क्वेरी सबसे तेज है

bool exist = session.QueryOver<Employee>() 
    .Where(x => x.EmployeeID == 1) 
    .RowCount() > 0; 

सबसे अच्छा विकल्प की वजह से अच्छी आदतें और कोड स्पष्टता

संबंधित मुद्दे