2009-03-26 12 views
12

कोई भी NHibernate.Linq का उपयोग करके NHibernate क्वेरी को बैच करने का तरीका जानता है जैसे आप मल्टीक्रिटारिया और आईसीट्रिटिया ऑब्जेक्ट्स के साथ कर सकते हैं?NHibernate.Linq और MultiCriteria

MultiCriteria साथ

मैं कुछ इस तरह बना सकते हैं: हम प्रयोग कर रहे हैं

var crit = session.CreateMultiCriteria() 
       .Add(session.Linq<Entity1>().Where(x => x.Property1 == "Value1") 
       .Add(session.Linq<Entity2>().Where(x => x.Property2 == "Value2"); 

var result = crit.List(); 
var list1 = (IList<Entity1>)result[0]; 
var list2 = (IList<Entity2>)result[1]; 

:

var crit = session.CreateMultiCriteria() 
        .Add(session.CreateCriteria(typeof(Entity1)).Add(Restrictions.Eq("Property1","Value")) 
        .Add(session.CreateCriteria(typeof(Entity2)).Add(Restrictions.Eq("Property2","Value2"));    

var result = crit.List(); 
var list1 = (IList)result[0]; 
var list2 = (IList)result[1]; 

यह अच्छा होगा अगर मैं की जगह CreateCriteria Linq कॉल के साथ कॉल करता है और कुछ इस तरह मिल हमारे अन्य प्रश्नों के लिए लिंक एपीआई और मल्टीक्रिटिया प्रश्नों को चलाने की आवश्यकता होने पर भी उसी लिंक सिंटैक्स का उपयोग करना अच्छा होगा।

धन्यवाद।

उत्तर

4
var query = from q in session.Linq<Person>() 
      where q.FirstName.StartsWith(firstName) 
      && q.LastName.StartsWith(lastName) 
      && q.Phones.Any(p => p.Number.Contains(phone)) 
      select q; 

// This block of code was found in the NHibernate.Linq source 
// using NHibernate.Linq.Visitors; 
// using NHibernate.Engine; 
System.Linq.Expressions.Expression expression = query.Expression; 
expression = Evaluator.PartialEval(expression); 
expression = new BinaryBooleanReducer().Visit(expression); 
expression = new AssociationVisitor((ISessionFactoryImplementor)session.SessionFactory).Visit(expression); 
expression = new InheritanceVisitor().Visit(expression); 
expression = CollectionAliasVisitor.AssignCollectionAccessAliases(expression); 
expression = new PropertyToMethodVisitor().Visit(expression); 
expression = new BinaryExpressionOrderer().Visit(expression); 
NHibernateQueryTranslator translator = new NHibernateQueryTranslator(session); 
object results = translator.Translate(expression, ((INHibernateQueryable)query).QueryOptions); 

// My LINQ query converted to ICriteria 
ICriteria resultsCriteria = results as ICriteria; 
// Convert to criteria that returns the row count 
ICriteria rowCountCriteria = CriteriaTransformer.TransformToRowCount(resultsCriteria); 

IList multiResults = session.CreateMultiCriteria() 
    .Add(resultsCriteria.SetMaxResults(20)) 
    .Add(rowCountCriteria) 
    .List(); 

IList people = (IList)multiResults[0]; 
int resultsCount = (int)((IList)multiResults[1])[0]; 

http://rndnext.blogspot.com/2009/05/using-nhibernate-multicriteria-and-linq.html से

3

NHibernate.Linq स्वयं LINQ अभिव्यक्ति से ICriteria में अनुवाद करने के लिए NHibernateQueryTranslator का उपयोग करता है। आप यह भी कर सकते हैं, फिर परिणामस्वरूप आईसीआरटीरिया को अपने IMultiCriteria में पास कर दें।

+0

धन्यवाद, मैं NHibernateQueryTranslator पर गौर और अगर मैं कुछ काम कर सकते हैं देखने के लिए होगा। –

0

मेरे पास एक ऐसा समाधान है जो एनएचबर्ननेट लिंक का उपयोग करके एक fetching रणनीतियों को बैच करने में सक्षम बनाता है, लेकिन कोड जटिल का राजा है। यहां सूचीबद्ध करने के लिए बहुत कुछ है। मैं जल्द ही devlicio.us पर अपने ब्लॉग पर इसके बारे में बात करने जा रहा हूं। जब मैं पहली पोस्ट लिखता हूं तो मैं इस टिप्पणी को अपडेट करूंगा।

+0

मैं आपकी पोस्ट पढ़ने के लिए तत्पर हूं। –