c#linq生成超过限制的查询长度。我们有什么方法可以解除这个限制吗?

时间:2012-12-18 13:11:45

标签: c# sql linq entity-framework

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

该报告有大量长字符串过滤器,当选择了很多字符串过滤器时,我收到此错误:“SQL语句的某些部分嵌套得太深。重写查询或将其分解为较小的查询。“

选择过滤器并返回List,在LINQ查询中我使用:

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

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

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

非常感谢。

感谢@AdrianFaciu提供的以下链接,这真的很有帮助,我认为这是类似的问题。 (我猜我的每个字符串过滤器的长度太长了,而且它们中有很多。) Hitting the 2100 parameter limit (SQL Server) when using Contains()

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

2 个答案:

答案 0 :(得分:2)

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

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

将所有报告从SProcs更改为Linq真是太愚蠢了......你是在浪费时间来制作更糟糕的解决方案。

答案 1 :(得分:0)

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

Foundedlist.RemoveAll(x =&gt;!RolesList.contains(x.id));