Nhibernate查询仅选择子表中至少存在一个的查询

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中 我试过这种方法,但没有成功

我的Nhibernate查询有问题

我的XML映射

我有两个表,表A(KeyField1,Field2,Field3)和表B(KeyField1,DateField)

我希望有这样的结果

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”)));很高兴看到我的回答对你有帮助