Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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
Nhibernate QueryOver Field1=真或(集合包含…)_Nhibernate_Queryover - Fatal编程技术网

Nhibernate QueryOver Field1=真或(集合包含…)

Nhibernate QueryOver Field1=真或(集合包含…),nhibernate,queryover,Nhibernate,Queryover,我正在为搜索表单编写一个处理程序。正在搜索的对象有3个布尔标志和几个集合(如ISet) 这些是相关的,因为标志表示集合中单个成员的抽象分组。在这种特定情况下,集合代表县、市和非常广泛的“地区”。布尔标志供作者指定实体IsAutoFState、IsStatewide和/或IsEverywhere(例如Internet) 还有其他非地理收藏(例如主题)。对这方面的任何限制都将受到地理限制的“和” 在搜索表单上,用户可以勾选感兴趣的特定地理区域(特定县和/或城市和/或地区),并扩大搜索范围,以包括设置

我正在为搜索表单编写一个处理程序。正在搜索的对象有3个布尔标志和几个集合(如ISet)

这些是相关的,因为标志表示集合中单个成员的抽象分组。在这种特定情况下,集合代表县、市和非常广泛的“地区”。布尔标志供作者指定实体IsAutoFState、IsStatewide和/或IsEverywhere(例如Internet)

还有其他非地理收藏(例如主题)。对这方面的任何限制都将受到地理限制的“和”

在搜索表单上,用户可以勾选感兴趣的特定地理区域(特定县和/或城市和/或地区),并扩大搜索范围,以包括设置了一个或多个额外布尔标志的项目(如果他们不勾选此框,我们不限制布尔字段)

在SQL中手动编写,我会执行以下操作:

SELECT ... FROM foo LEFT JOIN FooCounties fc ON foo.ID = fc.ID 
LEFT JOIN FooCities fct ON foo.ID = fct.ID ...
INNER JOIN FooTopics ft ON foo.ID = ft.ID
WHERE (fc.CountyID IN (1, 2, ...) OR fct.CityID IN (1, 3, 5, ...) OR foo.IsStatewide = 1)
      AND ft.TopicID IN (1, 4, 7, ...)
我怎样才能把这个翻译成QueryOver?到目前为止,我已经通过以下方式确定了主题和其他标准:

var query = Session.QueryOver<foo>();

if (SelectedTopicIDs.Count > 0) { 
  var TopicSubQ = QueryOver.Of<foo>().JoinQueryOver<Topic>(t => t.Topics)... etc.
  query = query.WithSubquery.WhereProperty(p => p.Id).In(TopicSubQ);
}
var query=Session.QueryOver();
如果(selectedtopids.Count>0){
var TopicSubQ=QueryOver.Of().JoinQueryOver(t=>t.Topics)…等等。
query=query.WithSubquery.WhereProperty(p=>p.Id).In(TopicSubQ);
}
但我不知道如何使用析取来比较最多3个布尔和最多3个子查询,然后将它们作为“and”与现有条件合并。

var query=session.QueryOver();
var query = session.QueryOver<foo>();
var or = new Disjunction().Add(Restrictions.Where<foo>(f => f.IsStatewide));

if (SelectedCountryIDs.Count > 0)
{
    Country countryAlias = null;
    var join = query.JoinAlias(f => f.Countries, () => countryAlias);
    or.Add(() => countryAlias.Id.IsIn(SelectedTopicIDs));
}

query.Where(or);

if (SelectedTopicIDs.Count > 0)
{
    Topic topicAlias = null;
    var join = query.JoinQueryOver<Topic>(f => f.Topics)
                    .WithSubquery.Where(() => topicAlias.Id).In(SelectedTopicIDs));
}
var or=new disconction().Add(Restrictions.Where(f=>f.IsStatewide)); 如果(SelectedCountryIDs.Count>0) { Country countryAlias=null; var join=query.JoinAlias(f=>f.Countries,()=>countryAlias); 或.Add(()=>countryAlias.Id.IsIn(SelectedTopicIDs)); } 询问:何处(或); 如果(selectedtopids.Count>0) { Topic topicAlias=null; var join=query.JoinQueryOver(f=>f.Topics) .WithSubquery.Where(()=>topicAlias.Id).In(SelectedTopicIDs)); }
我认为这是正确的,但它不喜欢query.JoinQueryOver:无法将“System.Linq.Expressions.MethodCallExpressionN”类型的对象强制转换为“System.Linq.Expressions.BinaryExpression”。第110行:主题topicAlias=null;第111行:var join=query.JoinQueryOver(f=>f.Topics)第112行:.WithSubquery.Where(()=>topicAlias.Id.IsIn(TopicIDs));(错误在第111行。)我将尝试重写子查询的方式…
var-TopicSubQuery=QueryOver.Of().JoinQueryOver(p=>p.Topics)。WhereRestrictionOn(t=>t.Id)。IsInG(TopicIDs)。选择(Projections.Property(p=>p.Id));query=query.WithSubquery.WhereProperty(p=>p.Id).In(TopicSubQuery)似乎适用于子查询。仍在编写更多的测试来证明这完全符合预期。