首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QueryOver:选择..。其中财产在(.)

QueryOver:选择..。其中财产在(.)
EN

Stack Overflow用户
提问于 2014-09-29 08:25:24
回答 1查看 1.5K关注 0票数 3

我尝试使用queryover来表示以下sql:

代码语言:javascript
复制
select * from Table1 t1 where t1.foreign_key in (select t2.Id from Table2 t2 where (...))

因此,我为内部select语句创建了一个子查询,如下所示:

代码语言:javascript
复制
 var sq = QueryOver.Of<Table2>().Where(...).Select(c => c.Id);

但是,当我不能在以下查询中使用此子查询时:

代码语言:javascript
复制
var query = QueryOver.Of<Table1>().WithSubquery.
 WhereProperty(t1 = t1.foreign_key).In(contactSubQuery);

我认为问题在于,QueryOver期望在Table1上而不是contactSubQuery中的Table2上进行子查询,但这样就无法访问Table2所需的属性。在How do I express a query containing a WHERE..IN subquery using NHibernate's QueryOver API?中,也解决了类似的问题(使用JoinAlias),但我不知道如何将该解决方案应用于我的情况。谢谢你的帮助!

解决办法:

谢谢你@Radim,你几乎是对的。我已经用了

代码语言:javascript
复制
Queryover.Of<T>() 

在查询中,问题是我将它分配给了一个IQueryOver变量(因为我们公司中有一个no var关键字样式向导)。在我把它分配给var之后,编译了它。由于我没有预料到这会导致问题,所以我将问题中的每个变量简化为var,所以发布的代码实际上应该已经运行了lol.我检查了类型并简单地将查询更改为(根据no-var规则):

代码语言:javascript
复制
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)

在我之前..。

代码语言:javascript
复制
IQueryOver<Table1, Table1> = ...

再次感谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-29 08:32:52

你就快到了,只是语法不是这样的:

代码语言:javascript
复制
var query = QueryOver.Of<Table1>().WithSubquery.
    WhereProperty(t1 = t1.foreign_key).IsIn(contactSubQuery);

但是:

代码语言:javascript
复制
 // 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()是一种通用的扩展方法:

代码语言:javascript
复制
/// <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>()。例如,这是错误的

代码语言:javascript
复制
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<>.的类型参数。不能从使用中推断。尝试显式指定类型参数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26095504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档