0

次のステートメントの基準を NHibernate で作成しようとしています。

SELECT *
  FROM InventoryItems
  where id not in (select inventory_id from InventoryItemCategories where Category_Id = 'EB0DA6DE-DC18-4306-9EF7-E506463555A9')

または、これはさらに優れていると思います

SELECT *
  FROM InventoryItems
  where id not exists (select inventory_id from InventoryItemCategories where Category_Id = 'EB0DA6DE-DC18-4306-9EF7-E506463555A9')

私はこれを試しましたが、うまくいきません:

 var criteria = Session.CreateCriteria<InventoryItem>()
      .Add(Subqueries.WhereNotExists(("id"), DetachedCriteria.For<InventoryItemCategories>()
       .Add(Restrictions.Eq("Category_id",inventoryCategoryId))));

助けてくれてどうもありがとう

4

4 に答える 4

1

2 つのエンティティを関連付けると、簡単になります

public class InventoryItem
{
    public virtual object Id{get;set;}
    public virtual IList<InventoryItemCategory> InventoryItemCategories{get;set;}
}
public class InventoryItemCategoriy
{
    public virtual InventoryItem InventoryItem{get;set;}
}
public class InventoryItemMap : ClassMap<InventoryItem>
{
    public InventoryItem()
    {
        Id(x=>x.Id);
        HasMany(x=>x.InventoryItemCategories).KeyColumn("Inventory_id");
    }
}
public class InventoryItemCategoryMap:ClassMap<InventoryItemCategory>
{
    public InventoryItemCategory()
    {
        References(x=>x.InventoryItem).Column("Id");
    }
}

そして、あなたのクエリは次のようになります

session.Query<InventoryItem>().Where(x=>!x.InventoryItemCategories.Any(c=>c.Id=="EB0DA6DE-DC18-4306-9EF7-E506463555A9")).ToList();
于 2013-11-05T19:57:19.730 に答える
0

次のように、サブクエリまたは not 制限を使用できます。

var subqueryFoodsWithCancerogenousSubstances = 
    DetachedCriteria.For(typeof(FoodCancerSubst))
            .SetProjection(Projections.Property("FoodId"));

ICriteria noCancerFood =
    session.CreateCriteria(typeof(Food))
    .Add(Subqueries.NotIn(subqueryFoodsWithCancerogenousSubstances))
    // check ID, else use PropertyNotIn(...)

または、NotIn を持たない分離値リストに IN 句を使用する場合:

    .Add(Restrictions.Not(Restrictions.In("Id", cancerogenousFoodIdsList)))
于 2013-11-05T19:44:48.670 に答える
0

次のようにできませんか?

criteria.Add(Restrictions.Not(Restrictions.In ("id", detachedCrit));
于 2013-11-05T19:45:35.560 に答える