[英]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.