使用InExpression进行nHibernate的情况

时间:2012-03-16 08:43:21

标签: c# nhibernate hql

非常难以在nHibernate中找出“where in”等价物。

我正在使用nHibernate 3.这样做的最佳方式是什么:

SELECT DISTINCT                                     
    U.ID as CID                         
FROM User U
WHERE                                               
CID IN (                                            
    SELECT RID                                      
    FROM ResellerSites rs                           
    INNER JOIN Locations l ON l.ID = rs.LID         
    WHERE   l.ID        =   14          
) 

我在某个地方发现了一个例子,说我需要这样的东西:

var criteria = session.CreateCriteria(typeof(User));

var resellerSites = new[] { new ResellerSite { Id = 1 }, new ResellerSite { Id = 2 } };
criteria.Add(new InExpression("ResellerSite", resellerSites));

这是我到目前为止所做的:

     var resellerSites = session.CreateCriteria<ResellerSite>("p")
                        .CreateCriteria("p.Locations", JoinType.InnerJoin)
                        .Add(Restrictions.Eq("locationID", locationId))
                        .List<ResellerSite>();

     criteria.Add(new InExpression("ResellerSite", resellerSites));

     var finalList = criteria.List<ResellerSite>();

“criteria.Add(new InExpression”部分给我一个intellisense错误,因为InExpression似乎期望类似:

 new[] { new ResellerSite { Id = 1 }, new ResellerSite { Id = 2 } };

与第一个例子中一样。

我应该像以下一样进行for循环:

foreach (var site in resellerSites)
{
    //somehow push into a  new[] ?
}

或类似的东西还是有更好的方法?

也许整个方法都错了?

2 个答案:

答案 0 :(得分:1)

您可以使用Linq轻松将resellerSites转换为数组:

criteria.Add(new InExpression("ResellerSite", resellerSites.ToArray()));

此问题也可能有所帮助:Cannot use collections with InExpression

答案 1 :(得分:1)

我会说输入问题来自双CreateCriteria和单个ToList()

很难说没有表定义,但是,重读代码,我想知道为什么你需要内部连接与位置。 可能是您可以将查询重写为:

SELECT DISTINCT                                     
    U.ID as CID                         
FROM User U 
    INNER JOIN ResellerSites rs
       on U.ID = rs.RID
       and rs.LID=14

让您的代码像(未经测试且不是最佳的,因为您只能使用一个条件查询加入)

var resellerSites = session.CreateCriteria<ResellerSite>()
                    .Add(Expression.Eq("locationID", locationId))
                    .List<ResellerSite>();

 criteria.Add(new InExpression("ResellerSite", resellerSites.ToArray()));

 var finalList = criteria.List<ResellerSite>();