非常难以在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[] ?
}
或类似的东西还是有更好的方法?
也许整个方法都错了?
答案 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>();