Nhibernate获得ICriteria的收藏

Nhibernate获得ICriteria的收藏,nhibernate,collections,Nhibernate,Collections,同事们。我在获取实体时遇到问题。映射: <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Clients.Core" namespace="Clients.Core.Domains"> <class name="Sales, Clients

同事们。我在获取实体时遇到问题。映射:

     <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
           assembly="Clients.Core"
           namespace="Clients.Core.Domains">
     <class name="Sales, Clients.Core" table='sales'>
        <id name="Id" unsaved-value="0">
          <column name="id" not-null="true"/>
          <generator class="native"/>
        </id>
        <property name="Guid">
           <column name="guid"/>
         </property>
        <set name="Accounts" table="sales_users" lazy="false">
            <key column="sales_id" />
            <element column="user_id" type="Int32" />
        </set>
     </class>
如何通过ICriterion对象执行此操作

非常感谢。

var sales=session.CreateCriteria(typeof(sales))
var sales = session.CreateCriteria(typeof(Sales))
                     .SetFetchMode("Accounts", FetchMode.Join)
                     .SetResultTransformer(Transformers.DistinctRootEntity)
                     .List<Sales>();
.SetFetchMode(“帐户”,FetchMode.Join) .SetResult变压器(变压器距离) .List();
我认为答案应该是:

public IEnumerable<Sales> GetSalesForUser(int userId)
{
    return session.CreateCriteria<Sales>()
        .CreateAlias("Accounts", "accounts")
        .Add(Restrictions.Eq("accounts.UserId", "userId"))
        .List<Sales>();
}
public IEnumerable GetSalesForUser(int userId)
{
返回会话。CreateCriteria()
.CreateAlias(“账户”、“账户”)
.Add(Restrictions.Eq(“accounts.UserId”、“UserId”))
.List();
}
但是我被你的模型弄糊涂了。看起来,客户与销售之间存在多对多关系,但您尚未将其映射为这种关系。我不确定如何过滤int集合(在本例中是HashSet)。你可以试试:

public IEnumerable<Sales> GetSalesForUser(int userId)
{
    return session.CreateCriteria<Sales>()
        .Add(Restrictions.Eq("Accounts", userId))
        .List<Sales>();
}
public IEnumerable GetSalesForUser(int userId)
{
返回会话。CreateCriteria()
.Add(Restrictions.Eq(“Accounts”,userId))
.List();
}

非常感谢。那么“WHERE su.user_id=:N”呢?非常感谢。你说得对。一次销售可能会有很多。我尝试了这个变体,但得到了“NHibernate.QueryException:NHibernate.Criteria.SimpleExpression中的类型不匹配:Accounts预期类型Iesi.Collections.Generic.ISet`1[System.Int32],实际类型System.Int32”。如果要坚持原始设计,应该有一种方法使用Criteria API过滤哈希集。但从长远来看,改进您的域模型会更好。
public IEnumerable<Sales> GetSalesForUser(int userId)
{
    return session.CreateCriteria<Sales>()
        .CreateAlias("Accounts", "accounts")
        .Add(Restrictions.Eq("accounts.UserId", "userId"))
        .List<Sales>();
}
public IEnumerable<Sales> GetSalesForUser(int userId)
{
    return session.CreateCriteria<Sales>()
        .Add(Restrictions.Eq("Accounts", userId))
        .List<Sales>();
}