C# 使用NHibernate标准API创建嵌套的OR语句
所以我喜欢学习关于NHibernate的新东西,因为它确实非常灵活,使我的生活变得轻松,除了我现在所处的困境;)。到目前为止,我还没有做过非常复杂的查询,这个也不复杂,但我觉得最常用的方法和对象类型不会解决这个问题 以下是我想要查询的内容:C# 使用NHibernate标准API创建嵌套的OR语句,c#,sql-server-2008,nhibernate,nested,criteria-api,C#,Sql Server 2008,Nhibernate,Nested,Criteria Api,所以我喜欢学习关于NHibernate的新东西,因为它确实非常灵活,使我的生活变得轻松,除了我现在所处的困境;)。到目前为止,我还没有做过非常复杂的查询,这个也不复杂,但我觉得最常用的方法和对象类型不会解决这个问题 以下是我想要查询的内容: SELECT _Table1.UserID, _Table1.ColorID, _Table1.AppID FROM _Table1 INNER JOIN _Table2 ON _Table2.AppID = _Table1.AppID WHERE _Ta
SELECT _Table1.UserID, _Table1.ColorID, _Table1.AppID FROM _Table1
INNER JOIN _Table2 ON _Table2.AppID = _Table1.AppID
WHERE _Table1.ColorID= @param0
AND (
_Table2.WindowID = @param1 OR
_Table2.WindowID = @param2 OR
_Table2.WindowID = @param3 OR
................ = @param(N - 1)
)
下面是我使用CriteriaAPI得到的
private IList<Table1Entity> FetchListByWindowId(int colorID, List<int> listOfWindowIDs)
{
var list = CurrentSession.CreateCriteria<Table1Entity>()
.Add(Restrictions.Eq("ColorID", colorID))
.CreateCriteria("Table2EntityList");
foreach (var item in listOfWindowIDs)
{
list.GetCriteriaByPath("Table2EntityList")
.Add(Restrictions.Eq("WindowID", Int32.Parse(item)
}
}
比如:
var disjunction = new Disjunction()
.Add(Restriction.Eq("WindowID", item1))
.Add(Restriction.Eq("WindowID", item2))
.Add(Restriction.Eq("WindowID", item3));
// Or use a loop if you like...
var list = CurrentSession.CreateCriteria<Table1Entity>()
.Add(Restrictions.Eq("ColorID", colorID))
.CreateCriteria("Table2EntityList")
.Add(disjunction);
var析取=新析取()
.Add(Restriction.Eq(“WindowID”,item1))
.Add(Restriction.Eq(“WindowID”,第2项))
.Add(Restriction.Eq(“WindowID”,第3项));
//如果你喜欢的话,也可以使用一个循环。。。
var list=CurrentSession.CreateCriteria()
.Add(Restrictions.Eq(“ColorID”,ColorID))
.CreateCriteria(“表2实体列表”)
.Add(析取);
类似于:
var disjunction = new Disjunction()
.Add(Restriction.Eq("WindowID", item1))
.Add(Restriction.Eq("WindowID", item2))
.Add(Restriction.Eq("WindowID", item3));
// Or use a loop if you like...
var list = CurrentSession.CreateCriteria<Table1Entity>()
.Add(Restrictions.Eq("ColorID", colorID))
.CreateCriteria("Table2EntityList")
.Add(disjunction);
var析取=新析取()
.Add(Restriction.Eq(“WindowID”,item1))
.Add(Restriction.Eq(“WindowID”,第2项))
.Add(Restriction.Eq(“WindowID”,第3项));
//如果你喜欢的话,也可以使用一个循环。。。
var list=CurrentSession.CreateCriteria()
.Add(Restrictions.Eq(“ColorID”,ColorID))
.CreateCriteria(“表2实体列表”)
.Add(析取);
可能重复:不,我已经看过了,我能得到的只是表达式。或者想要两个东西相互比较。我相信我想要的是限制一个字段等于一组数据中的一个项。我不是在做比较。但我没有花时间研究析取。我想析取()是正确的一步,因为我有一组项,我想说a或B或C。。。但我添加了一个Expressions.Disjunction(),结果仍然是同一个查询。可能重复:不,我已经看过了,我只能得到一个表达式。或者想要两个东西相互比较。我相信我想要的是限制一个字段等于一组数据中的一个项。我不是在做比较。但我没有花时间研究析取。我想析取()是正确的一步,因为我有一组项,我想说a或B或C。。。但是我添加了一个Expressions.Disjunction(),结果仍然是同一个查询。是的,这很有效。太棒了,我真的很感谢你的帮助。我所做的是创建了一个析取,在我的循环中添加了限制,然后我列出了我的列表(就像你的答案一样)。查询结果为“从表1中选择*在ID=ID上内部连接表2,其中颜色=P0和(窗口=P1或P2…PN)”,感谢您的快速回复。是的,这很有效。太棒了,我真的很感谢你的帮助。我所做的是创建了一个析取,在我的循环中添加了限制,然后我列出了我的列表(就像你的答案一样)。查询结果为“从表1中选择*在ID=ID上内部连接表2,其中颜色=P0和(窗口=P1或P2…PN)”,感谢您的快速回复。
var disjunction = new Disjunction()
.Add(Restriction.Eq("WindowID", item1))
.Add(Restriction.Eq("WindowID", item2))
.Add(Restriction.Eq("WindowID", item3));
// Or use a loop if you like...
var list = CurrentSession.CreateCriteria<Table1Entity>()
.Add(Restrictions.Eq("ColorID", colorID))
.CreateCriteria("Table2EntityList")
.Add(disjunction);