题
我正在尝试使用Nhibernate Criteria来执行我只能描述为IN()的反向版本。
而不是说存储在属性中的值是在列表/集合X
中我想说,这个值X(一个ID)在列表中,它是对象的属性。
任何帮助表示感谢,如果没有任何意义,我可以尝试更好地解释。
编辑向人们道歉,据我所知,这没有足够的意义......
我的系统中有一个事件项,可以有一个适用于它的受众(项目)列表。如果管理员想要删除Audience项目,我想检查该项目是否未被任何事件引用。 (AudienceList存储为受众群体的ID字符串列表)。
我在想的是:
var results = SessionInstance.Session.CreateCriteria(typeof(EventItem.Items.EventItem))。Add(Restrictions.In(" AudienceList",myAudience.ID)) .LIST();
但我需要AudienceList和myAudience.ID才能成为另一种方式吗?我有受众ID但需要检查它是否在其他ID列表中。
再次感谢。
编辑2
EventItem的定义是其中一个属性是Audience ID的DetailCollection,它们作为ID的字符串列表保存到DB中。
解决方案
嗯,这听起来好像没有一个真正的关系模型,所以事情不会那么漂亮。没有外键等,我不确定NHibernate在这种情况下会有多大用处(至少可以产生一个很好的查询)。
如果单个事件记录的所有Audience ID都存储在单个字段中,则您必须使用SQL LIKE或在代码中执行此操作。获取所有EventItem并迭代它们,检查其AudienceList集合中是否有您要查找的ID。如果你走这条路线,最好创建一个DTO来最小化你移动的数据量。像
这样的东西session.CreateQuery("select new AudienceListDTO(e.AudienceList) from EventItems e").List();
假设您只需要通知用户“此受众群体类型仍在使用中”,并没有指出具体的例子。否则你将不得不添加更多数据。
其他提示
你的意思是这样吗?
class YourClass {
List<int> theList;
}
IQueryable<YourClass> query = ...;
var result = from c in query where c.theList.Contains(value);