2

我需要使用 nHibernate Criteria 重新创建查询。这个查询有一个非常丑陋的 where 子句。

((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'))

所以,我从这里开始

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

铅上的属性是一个CallDisposition对象的问题,Unknown entity class: System.String当我尝试这样做时给我一个错误。一个 Array ofCallDisposition就是它正在寻找的东西。

基本上我正在寻找的是满足原始​​查询的所有或标准的潜在客户列表。任何建议都是有帮助的。

4

2 回答 2

2

在不知道您的实体的属性的情况下,很难发表评论。

如果 CallDisposition 属性是具有 CallDispositionCode 属性的 CallDisposition 实体,那么您可以执行以下操作:

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

或者,如果 CallDisposition 有一个 Id,您可以将您的第二个解决方案修改为以下内容:

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();

这将只是一个使用子选择的数据库命中。

于 2009-07-01T09:48:51.600 回答
1

好的...我达到了预期的结果,但我采取了不同的方式。

首先我这样做了

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

其次是这个

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

如果我将 存储CallDispositionCodeLead对象中,我将能够直接访问 Lead 并获得CallDispositionCode. 这是一个设计问题。

如果有人有任何建议或意见,我很想听听。

于 2009-07-01T09:37:27.567 回答