Telerik 网格 <->冬眠

发布于 2024-12-03 07:52:43 字数 437 浏览 2 评论 0 原文

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

public IEnumerable GetBlas() { 返回Session.Query(); 。

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

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

谢谢。

基督教

I have started to use telerik grids recently (for ASP.NET MVC). The 'Linq-based expression engine' does all the heavy lifting for you: paging, sorting and filtering. It just needs to be hooked up with a repository method like this:

public IEnumerable GetBlas()
{
return Session.Query();
}

I have the following problem now. I would like to use ICriteria and Restrictions.In("x", list.ToArray()) where list is of type IList and is populated by another process. The problem is that list can contain hundreds of values and this might throw an exception as the generated SQL code’s ‘IN PART’ (e.g. IN (1, 2, ....., 10000)) might be far too long.

Is there a way to implement this without having to switch to pure SQL and dealing with all the query strings etc. the telerik grid sends? Hope this makes sense.

Thanks.

Christian

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

伴梦长久 2024-12-10 07:52:43

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

如果 ICriteria 不是一个选项,可以有一个解决方法,您可以创建多个 Future 查询,如下所示(经过测试的代码,仅与数据库进行 1 次往返):

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");

The idea is to divide the list of 10,000 items into smaller lists of (say) 1000 items each.
The easiest way to do the query is using ICriteria, where you can add as many Disjunctions as you need for each sub-collection you have.

If ICriteria is not an option, there can be a workaround where you create multiple Future queries, like so (tested code, which does only 1 roundtrip to the db):

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");
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文