我看到与使用LINQ to SQL执行查询相关的超时问题。所以我做了一个简单的控制台程序,问题仍然发生,并非总是如此,但随机的次数让我担心。这几乎是我的整个计划:
public static TransactionDataContext DataContext = new TransactionDataContext();
static void Main(string[] args)
{
int year = ...;
int stateCode = ...;
DateTime minYear = new DateTime(year, 01, 01);
DateTime maxYear = new DateTime(year, 12, 31);
var volumes = DataContext.TRANSACTIONs.Where(p =>
p.STATE_NO == stateCode &&
p.TRANS_DATE >= minYear &&
p.TRANS_DATE <= maxYear).OrderBy(p => p.TRANS_DATE);
}
我数据库中的TRANSACTION表有10M +记录。在最后一个结束大括号设置断点,我运行调试器。有时,扩展卷变量和结果视图会显示数据,有时会显示“功能评估超时”。通过设置DataContext.CommandTimeout来延长超时似乎没有帮助,我认为这无论如何都不是解决方案。
我的问题是为什么LINQ to SQL有这种限制或者我做错了。
更新:从Management Studio运行SQL语句没问题,所以我认为这不是索引问题。
答案 0 :(得分:2)
这可能比LINQ更多地是SQLServer问题。 您需要在TRANS_DATE
和STATE_NO
上设置覆盖索引。如果你没有,那就解释了问题,这不是LINQ问题。
答案 1 :(得分:2)
我不认为问题是因为您有10M记录,因为查询尚未执行(因为您没有调用ToList
或ToArray
)。
生成SQL脚本需要花费时间。
我认为首先删除一些查询参数,例如,删除OrderBy
,然后将“仅限于p.STATE_NO == stateCode
”,然后检查会发生什么。
然后,逐步添加一些参数,你会看到导致问题的原因。 甚至可能是这种日期比较不受支持,或者STATE_NO可能是来自stateCode的不同类型,我不确定,我只是在大声思考。
这将帮助您解决问题。
您还希望测试使用Entity-SQL或programmatically(甚至是硬编码查询)来塑造您的查询(无linq),这将有助于您解决问题。
另一个人认为您要考虑使用ToTraceString
来查看EF为您的linq生成的内容。
但是,如果上述内容对您没有任何帮助,那么您必须向我们提供您的异常详细信息/堆栈跟踪,以便为我们提供有关这一切的全部信息。