QueryOver:选择..其中属性在(..)中
本文关键字:属性 QueryOver 选择 | 更新日期: 2023-09-27 18:24:58
我尝试使用queryover来表示以下sql:
select * from Table1 t1 where t1.foreign_key in (select t2.Id from Table2 t2 where (...))
因此,我为内部select语句创建了一个子查询,如下所示:
var sq = QueryOver.Of<Table2>().Where(...).Select(c => c.Id);
但是,当我不能在以下查询中使用此子查询时:
var query = QueryOver.Of<Table1>().WithSubquery.
WhereProperty(t1 = t1.foreign_key).In(contactSubQuery);
我认为问题是QueryOver在contactSubQuery中期望Table1上的子查询,而不是Table2,但我无法访问Table2所需的属性。在"如何表达包含WHERE的查询"中。。使用NHibernate';s QueryOver API?类似的问题也得到了解决(使用Joinlias),但我不知道如何将该解决方案应用于我的案例。谢谢你的帮助!
解决方案:
谢谢@Radim,你几乎是对的。我已经在使用了
Queryover.Of<T>()
在查询中,但问题是我将其分配给了一个IQueryOver变量(因为我们公司有一个无var关键字styleguide)。在我把它分配给var之后,它就编译了。由于我根本没有想到这会导致问题,我将问题中的每个变量都简化为var,所以发布的代码实际上应该已经工作了。哈哈…我检查了类型,并简单地将查询更改为(根据无var规则):
QueryOver<Table1> = QueryOver.Of<Table1>()
.WithSubquery
.WhereProperty(t1 => t1.foreign_key)
// won't compile, because passed is IQueryOver<T,T>,
// not the QueryOver<U>
.In(subquery)
在我之前。。。
IQueryOver<Table1, Table1> = ...
再次感谢大家的帮助!
你差不多到了,只是语法不是这样的:
var query = QueryOver.Of<Table1>().WithSubquery.
WhereProperty(t1 = t1.foreign_key).IsIn(contactSubQuery);
但是:
// subquery "sq"
var sq = QueryOver.Of<Table2>().Where(...).Select(c => c.Id);
var query = QueryOver.Of<Table1>()
.WithSubquery
.WhereProperty(t1 => t1.foreign_key)
.In(sq) // instead of .IsIn(contactSubQuery)
...
因为.IsIn()
是一种通用的扩展方法:
/// <summary>
/// Apply an "in" constraint to the named property
/// Note: throws an exception outside of a QueryOver expression
///
/// </summary>
public static bool IsIn(this object projection, ICollection values);
而.In()
是返回结果"QueryOverSubqueryPropertyBuilderBase
"的方法(.WhereProperty()
调用的结果)
此外,请确保传递到.In(subquery)
的参数是QueryOver.Of<T>()
。例如,这是错误:
var subquery = session.QueryOver<T>(); // it is named subquery
// but it is not of a type QueryOver<T>, but of a type
// IQueryOver<T, T>
// which is not what is expected here
var query = QueryOver.Of<Table1>()
.WithSubquery
.WhereProperty(t1 => t1.foreign_key)
// won't compile, because passed is IQueryOver<T,T>,
// not the QueryOver<U>
.In(subquery)
...
这将产生:
错误1方法"
NHibernate.Criterion.Lambda.QueryOverSubqueryBuilderBase<NHibernate.IQueryOver<>
…"的类型参数。。。。无法根据用法推断。请尝试显式指定类型参数。