Nhibernate查询仅选择子表中至少存在一个的查询
我的Nhibernate查询有问题 我的XML映射 我有两个表,表A(KeyField1,Field2,Field3)和表B(KeyField1,DateField) 我希望有这样的结果Nhibernate查询仅选择子表中至少存在一个的查询,nhibernate,queryover,nhibernate-criteria,Nhibernate,Queryover,Nhibernate Criteria,我的Nhibernate查询有问题 我的XML映射 我有两个表,表A(KeyField1,Field2,Field3)和表B(KeyField1,DateField) 我希望有这样的结果 TableA ------------------ KeyField1 | Field2 | Field 3 K1 | A1 | True K3 | A3 | True 这意味着我希望表A中的所有记录中至少只有一个记录在表B中 我试过这种方法,但没有成功
TableA
------------------
KeyField1 | Field2 | Field 3
K1 | A1 | True
K3 | A3 | True
这意味着我希望表A中的所有记录中至少只有一个记录在表B中
我试过这种方法,但没有成功
DetachedCriteria query = DetachedCriteria.For(typeof(TableA), "_request");
query.CreateAlias("TableB", "pl");
query.Add(
Restrictions.And(
Restrictions.Eq("Field3", true),
Restrictions.Gt( Projections.Count("pl.ID") , 0)
)
);
有什么建议吗?我们可以使用子查询和EXISTS语句
TableA parent = null;
TableB child = null;
// parent query (TableA)
// will be filtered by existing children
// but still will be ready for paging
var parentQuery = session.QueryOver<TableA>(() => parent)
.WithSubquery
.WhereExists(
// subquery, where we assure that child exists for parent ID
QueryOver.Of<TableB>(() => child)
.Where(() => child.TableA.ID == parent.ID)
.Select(_ => child.ID)
);
// parents which fit to our needs
IList<TableA> result = parentQuery
.Take(10)
.Skip(0)
.List<TableA>();
tableaparent=null;
TableB child=null;
//父查询(表A)
//将按现有子级筛选
//但仍将为分页做好准备
var parentQuery=session.QueryOver(()=>parent)
.带subquery
.哪里有(
//子查询,其中我们确保父ID的子项存在
(()=>子项)的查询版本
.Where(()=>child.TableA.ID==parent.ID)
.Select(=>child.ID)
);
//适合我们需要的父母
IList result=parentQuery
.Take(10)
.Skip(0)
.List();
也就是说
QueryOver
语法和ICriteria
几乎是一样的…我们可以使用subquery和EXISTS语句
TableA parent = null;
TableB child = null;
// parent query (TableA)
// will be filtered by existing children
// but still will be ready for paging
var parentQuery = session.QueryOver<TableA>(() => parent)
.WithSubquery
.WhereExists(
// subquery, where we assure that child exists for parent ID
QueryOver.Of<TableB>(() => child)
.Where(() => child.TableA.ID == parent.ID)
.Select(_ => child.ID)
);
// parents which fit to our needs
IList<TableA> result = parentQuery
.Take(10)
.Skip(0)
.List<TableA>();
tableaparent=null;
TableB child=null;
//父查询(表A)
//将按现有子级筛选
//但仍将为分页做好准备
var parentQuery=session.QueryOver(()=>parent)
.带subquery
.哪里有(
//子查询,其中我们确保父ID的子项存在
(()=>子项)的查询版本
.Where(()=>child.TableA.ID==parent.ID)
.Select(=>child.ID)
);
//适合我们需要的父母
IList result=parentQuery
.Take(10)
.Skip(0)
.List();
也就是说,
QueryOver
语法和ICriteria
几乎是一样的…检查了你的个人资料,发现这应该有助于你理解,所以:检查了你的个人资料,发现这应该有助于你理解,所以:亲爱的Radim Köhler,最后我通过使用query.Add找到了答案.Add(subquerys.PropertyIn(“ID”),DetachedCriteria.For().SetProjection(Projections.Property(很高兴看到我的答案帮助了你亲爱的Radim Köhler,最后我通过使用query.Add(Restrictions.Eq(“Field3”,true)).Add(subquerys.PropertyIn)找到了答案(“ID”,DetachedCriteria.For().SetProjection(Projections.Property(“tabla.ID”)));很高兴看到我的回答对你有帮助