2

我正在尝试使用 Nhibernate Criteria 执行我只能描述为 IN() 的反向版本..

而不是说存储在属性中的值在列表/集合中 X

我想说,这个值 X(一个 ID)在作为对象属性的列表中。

任何帮助表示赞赏,如果这没有意义,我可以尝试更好地解释。

编辑向人们道歉,因为我知道这没有足够的意义......

我的系统中有一个事件项目,它可以有一个适用于它的受众(项目)列表。如果管理员想要删除受众项目,我想检查该项目是否未被任何事件引用。(AudienceList 存储为 Audiences 的 ID 字符串列表)。

我当时的想法是这样的:

var results = SessionInstance.Session.CreateCriteria(typeof(EventItem.Items.EventItem)) .Add(Restrictions.In("AudienceList", myAudience.ID)) .List();

但是我需要 AudienceList 和 myAudience.ID 反过来不是吗?我有观众 ID,但需要检查它是否在其他 ID 列表中。

再次感谢。

编辑 2

EventItem 的定义是它的属性之一是受众 ID 的 DetailCollection,它们作为 ID 的字符串列表保存到数据库中。

4

2 回答 2

2

编辑:废弃了我之前的答案。

好吧,听起来这里没有真正的关系模型,所以事情不会那么漂亮。如果没有外键之类的,我不确定 NHibernate 在这种情况下会有多大用处(至少可以生成一个不错的查询)。

如果单个事件记录的所有受众 ID 都存储在单个字段中,则您必须使用 SQL LIKE 或在代码中执行此操作。获取所有 EventItems 并遍历它们,检查他们的 AudienceList 集合以获取您正在寻找的 ID。如果你走这条路,最好创建一个 DTO 以最大限度地减少你移动的数据量。就像是

session.CreateQuery("select new AudienceListDTO(e.AudienceList) from EventItems e").List();

假设您只需要通知用户“此受众类型仍在使用中”,而不是指出具体实例。否则,您将不得不添加更多数据。

于 2009-04-29T12:58:14.750 回答
0

你的意思是这样的吗?

class YourClass {
    List<int> theList;
}

IQueryable<YourClass> query = ...;
var result = from c in query where c.theList.Contains(value);
于 2009-04-29T12:34:59.533 回答