Nhibernate telerik电网<-&燃气轮机;亚硝酸铵

Nhibernate telerik电网<-&燃气轮机;亚硝酸铵,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我最近开始使用telerik网格(用于ASP.NET MVC)。“基于Linq的表达式引擎”为您完成所有繁重的工作:分页、排序和过滤。它只需要与存储库方法连接,如下所示: 公共IEnumerable GetBlas() { 返回Session.Query(); } 我现在有以下问题。我想使用ICriteria和Restrictions.In(“x”,list.ToArray()),其中列表的类型为IList,并由另一个进程填充。问题是列表可能包含数百个值,这可能会引发异常,因为生成的SQL代码的

我最近开始使用telerik网格(用于ASP.NET MVC)。“基于Linq的表达式引擎”为您完成所有繁重的工作:分页、排序和过滤。它只需要与存储库方法连接,如下所示:

公共IEnumerable GetBlas() { 返回Session.Query(); }

我现在有以下问题。我想使用ICriteria和Restrictions.In(“x”,list.ToArray()),其中列表的类型为IList,并由另一个进程填充。问题是列表可能包含数百个值,这可能会引发异常,因为生成的SQL代码的“部分”(例如(1,2,…,10000))可能太长

有没有一种方法可以实现这一点,而不必切换到纯SQL并处理telerik网格发送的所有查询字符串等?希望这是有意义的

谢谢


Christian

这个想法是将10000个项目的列表分成更小的(比如)1000个项目的列表。
执行查询的最简单方法是使用
ICriteria
,您可以根据需要为每个子集合添加任意数量的
析取

如果
ICriteria
不是一个选项,那么可以通过一种变通方法创建多个
未来的
查询,就像这样(已测试的代码,它只对数据库进行一次往返):

string[]name={“boris”,“admin”,“scheduleuser”},moreNames={“adminuser”};
var x=session.Query()
.Where(u=>names.Contains(u.Name)).ToFuture();
var y=session.Query()
.Where(u=>moreNames.Contains(u.Name)).ToFuture();
var res=x.Union(y);
DebugFormat(“找到{0}个用户。第一个用户是:{1}”,res.Count(),res.Count()>0?res.First()。全名:“无”);

我不确定自己是否理解问题所在;您担心您的'in'子句包含的值太多?在这种情况下,您可以将其拆分为chuck,即“Restrictions.in”(“x”,sublist1)或Restrictions.in”(“x”,sublist2)等。这仍然会导致SQL代码(由nhibernate生成)太长,我相信!但是我不确定SQL server是否不喜欢SQL的长度或参数的数量…不确定SQL server;这在甲骨文上对我有用。我建议您尝试一下,看看效果如何。请您提供一些(存储库)代码作为答案。我刚刚意识到(我认为)telerik的“基于Linq的表达式引擎”不符合标准。。。不确定如何实现限制。在使用IQuery时。@csetzkom-您如何管理NH会话?我的应用程序一直保持会话打开以填充DevExpress网格,我目前正在尝试解决该问题。哇,看起来很棒。只需要考虑一下动态情况,我不知道有多少x和y-s…您需要一个
列表
来替换示例中的
x
y
,然后对其进行迭代,
Union
对整个过程进行排序。没什么,真的:)
string [] names = {"boris", "admin", "scheduleuser"}, moreNames = {"adminuser"};
var x = session.Query<User>()
                .Where(u => names.Contains(u.Name)).ToFuture();

var y = session.Query<User>()
                .Where(u => moreNames.Contains(u.Name)).ToFuture();

var res = x.Union(y);

log.DebugFormat("found {0} users. 1st user is : {1}", res.Count(), res.Count() > 0 ? res.First().FullName : "none");