4

嗨,我正在构建一个 MVC 4 报告,并使用 EF5。数据库在 SQL 2005 上。

The report has a large amount of long string filters, when there are a lot of them selected, I got this error:"Some part of your SQL statement is nested too deeply. Rewrite the query or break it up into smaller queries."

选择过滤器并返回一个列表,在我使用的 LINQ 查询中:

DataContext.Entity.Where(list.Contains(column));
return IQueryable<Entity>;

我猜这是超过限制的 LINQ 生成的 SQL 查询,我不知道限制是什么。

有什么办法可以控制这个限制吗?或者请指出我的猜测是否错误。

非常感谢。

感谢@AdrianFaciu 提供的以下链接,它真的很有帮助,我认为这是类似的问题。(我猜我的每个字符串过滤器的长度都太长了,而且数量很多。) 使用 Contains() 时达到 2100 参数限制(SQL Server)

我已经阅读了一些解决方法,但仍在寻找合适的解决方案,而不是通过生成字符串查询。至少现在看来,我必须逐步加载数据以减少查询的长度。

4

2 回答 2

4

正确的解决方案是直接使用 SQL。EF 和 Linq 不是编写报告查询的工具。它是 ORM - 您可以使用它从数据库中获取对象与它们一起工作,也可能修改它们并将它们存储回数据库。

如果您需要复杂的查询只是为了从数据库中提取数据以构建报告或一些复杂的搜索引擎,您应该简单地传递 ORM 的复杂性并转到低级 SQL - 如果您达到查询或参数的大小限制,您真的需要它. 它将使您的查询更简单、更小、更快,并且允许您使用一些高级功能,如表值参数,以避免大的包含调用。

将所有报告从 SProcs 更改为 Linq 真的很愚蠢……您正在浪费时间来产生更糟糕的解决方案。

于 2012-12-19T11:41:40.147 回答
0

我在 EF 和 Firebird 上遇到了类似的问题——当 where 子句中的 linq 查询有两个包含时。解决方案简单但不优雅——LoadAll,并在内存中过滤它们。

建立列表.RemoveAll(x=> !RolesList.contains(x.id));

于 2013-07-04T14:33:44.693 回答