Question

I need to recreate a query using nHibernate Criteria. This query had a where clause that was pretty ugly.

((t.Disposition_CD)='ac' Or    
 (t.Disposition_CD)='cc' Or  
 (t.Disposition_CD)='Co' Or  
 (t.Disposition_CD)='SF' Or  
 (t.Disposition_CD)='SC' Or  
 (t.Disposition_CD)='OR' Or  
 (t.Disposition_CD)='SV' Or  
 (t.Disposition_CD)='RI' Or  
 (t.Disposition_CD)='WN' Or  
 (t.Disposition_CD)='NC' Or  
 (t.Disposition_CD)='DN' Or  
 (t.Disposition_CD)='WT' Or  
 (t.Disposition_CD)='MA' Or  
 (t.Disposition_CD)='TO' Or  
 (t.Disposition_CD)='OC'))

so, I started here

IList leadList = 
     session.CreateCriteria(typeof(Lead)).Add(Expression.In("CallDisposition", 
     new string[] {"AC","CC" })).List();

the problem the Property on Lead is a CallDisposition Object and gives me a Unknown entity class: System.String error when I try to do this. An Array of CallDisposition is what it's looking for.

Basically what I'm looking for is a list of Leads that meet all the or criteria of the original query. Any suggestions are helpful.

Was it helpful?

Solution

Without knowing the properties of your entities it is hard to comment.

If the CallDisposition property is a CallDisposition entity that has a CallDispostionCode property then you could do something like this:

IList leadList = session.CreateCriteria(typeof(Lead))
   .Add(Expression.In("CallDisposition.CallDispostionCode", 
                      new string[] {"AC","CC" })).List();

Or if CallDisposition has an Id you could modify your second solution to something like this:

DetachedCriteria criteria = DetachedCriteria.For<CallDisposition>()
    .Add(Expression.In("CallDispostionCode", new string[] { "AC", "CC" })
    .SetProjection(Projections.Property("CallDisposition.Id"));

IList leadList = session.CreateCriteria(typeof(EmcLead))
    .Add(Subqueries.PropertyIn("CallDisposition.Id", criteria)).List();

This would be only one database hit using a subselect.

OTHER TIPS

ok...I achieved the desired results but I went about it a different way.

first I did this

IList DispList = session.CreateCriteria(typeof(CallDisposition)).Add(Expression.In("CallDispostionCode", new string[] { "AC", "CC" })).List();

followed by this

IList leadList = session.CreateCriteria(typeof(EmcLead)).Add(Expression.In("CallDisposition", DispList)).List();

if I stored the CallDispositionCode in the Lead object I would be able to right to the Lead and get the CallDispositionCode. It's a design issue.

If anyone has any suggestions, or comments, I would be interested in hearing.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top