Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用NHibernate标准API创建嵌套的OR语句_C#_Sql Server 2008_Nhibernate_Nested_Criteria Api - Fatal编程技术网

C# 使用NHibernate标准API创建嵌套的OR语句

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

所以我喜欢学习关于NHibernate的新东西,因为它确实非常灵活,使我的生活变得轻松,除了我现在所处的困境;)。到目前为止,我还没有做过非常复杂的查询,这个也不复杂,但我觉得最常用的方法和对象类型不会解决这个问题

以下是我想要查询的内容:

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);