【发布时间】:2015-04-19 13:38:53
【问题描述】:
我在一个项目中使用 MVC4 和 Entity Framework 5。我们有一个名为MAIN_TABLE 的主表,并且有几个子表(即:CHILD_TABLE1、CHILD_TABLE2 等)
由于这些不同的子表中的过滤选项很少,我们面临着 LINQ 查询执行速度的问题。
我必须编写一个查询来使用 EF5 从模型中过滤数据。 现在我们一次基于单个过滤器进行编码。即我们正在检查每个过滤的列并触发查询。但它太慢了。还有其他选择吗?
string[] strValue = filter_Values;
foreach (SelectedData selectedData in objSelectedDataCollection.DataCollection)
{
switch (selectedData.ColumnName) // This is the column name in the GridView defined
{
case "Outlook":
indlist = from jd in indlist
where jd.IND_APP_PASS_STATUS.Any(
ob => strValue.Contains(ob.Outlook))
orderby jd.Indman_ID
select jd;
break;
case "RS_TP":
indlist = from jd in indlist
where jd.IND_APP_PASS_STATUS.Any(
ob => strValue.Contains(ob.RS_TP))
orderby jd.Indman_ID
select jd;
break;
case "Code":
indlist = (from jd in indlist from jk in jd.IND_APP_PASS_STATUS where strValue.Contains(jk.Code) select jd).ToList();
break;
}
}
【问题讨论】:
-
嗯
string.Contains()实际上不是在您的端执行而不是在 SQL 服务器端执行吗?任何人?如果是这样,这就是为什么它很慢 -
使用 SQL 分析器查看发送到数据库引擎的查询是什么。如果您需要优化查询,您可能需要手动编写 SQL 而不是使用 EF。
-
你可能需要一些索引。
-
对于小型项目,我喜欢 EF 的简单性。当我必须处理更复杂的查询时,我会用存储过程来代替它们。
-
发布最有用的是最终查询及其执行计划。没有这些,如果不知道表的架构、定义了哪些索引以及它包含多少行,就不可能回答这个问题。您还需要提供使用的映射 - 如果
jd使用继承,则可能会导致最终查询中出现一个或多个连接。我首先要看的是 IND_APP_PASS_STATUS`。如果它没有被索引覆盖,数据库将被强制扫描整个表。
标签: c# linq entity-framework asp.net-mvc-4