繁体   English   中英

在SQL中推迟执行where

[英]deferred execution of where in sql

我有一个编辑器,人们可以在其中创建自定义sql查询。 这些查询是NHibernate.IQuery对象。

在我们的项目中,我们使用NHibernate.Linq.LinqExtensionMethods.Query来获取IQueryable对象,该对象可用于应用延迟执行的过滤器(DB上的所有内容)。

现在,我想创建另一个基于自定义sql查询的过滤器。 我想要的是这样的:

queryable.Where(x=> <sql-query contains x>)

我现在唯一能做的就是事先执行sql-query,然后使用结果元素列表过滤可查询对象。

IList<T> elements = query.List<T>();
queryable.Where(x => elements.Contains(x)).ToList();

这种方法的问题在于,元素列表可能很大。 如果可能的话,我想直接在数据库上执行整个语句,这样我就不必将所有对象都传输到我的应用程序,然后将所有对象作为过滤器参数发送回数据库...

编辑:第一个查询(产生第二个查询中要检查的元素列表的查询)是由普通的sql-string构造的,如下所示:

ISQLQuery sqlQuery = CurrentSession.CreateSQLQuery(myQueryString);//create query
sqlQuery.AddEntity(typeof (T)); //set result type
IQuery query = sqlQuery.SetReadOnly(true);

如果您有ID,则应在query选择ID,然后将其与第二个查询中的相应ID列进行比较。

var elementIdsToUseInContain = query
    .Select(x => x.YourIdProperty);
var result = queryable
    .Where(x => elementIdsToUseInContain.Contains(x.YourIdPropertyToCompareTo))
    .ToList();

注意:我尚未测试过,但这是相当标准的Linq。 这取决于NHibernate是否支持它,我不知道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM