EF Code First sql查询生成时间

时间:2011-10-21 11:10:37

标签: asp.net-mvc entity-framework ef-code-first

在我们的解决方案中,我们使用Code First。在开发过程中,我们发现了一个问题,即SQL查询生成需要很长时间(大约1-2秒)。

通常系统看起来像这样:
1.我们有一个通用的存储库 - 所有数据都通过这个存储库:

public virtual IEnumerable<T> Find<T>(Expression<Func<T, bool>> where, params Func<IQueryable<T>, IQueryable<T>>[] entitySet) where T : class
        {
            var q = this.Context.GetDbSet<T>();

            if (entitySet != null)
            {
                foreach (var func in entitySet)
                {
                    q = func(q);
                }
            }

            return q.AsExpandable().Where(where).ToList();
        }

使用此方法,我们从数据库中获取数据(传递我们需要的参数)。

EF生成的SQL查询很好(数据是从数据库中快速获取的,所以它不是瓶颈)。据我们所知,问题出在SQL语句生成中。

有人有答案吗?

重要信息:
我们将MySQL(Amazon RDS)与.NET Connector 6.4.4一起使用

我们尝试使用CompiledQuery,但它不适用于Code First(可能有人知道解决方法吗?)。

----- -----修订

有linq请求的例子:

var foundGreeting = GenericRepository.Instance.Find<Greetings>(
                                      greeting => currentTime >= greeting.From && currentTime <= greeting.Due,
                                      entitySet => entitySet.Include(g => g.Labels),
                                      entitySet => entitySet.Include(g => g.Labels.Versions)).FirstOrDefault();

这会产生:

SELECT
`Project1`.`GreetingId`, 
`Project1`.`From`, 
`Project1`.`Due`, 
`Project1`.`TextLabelId`, 
`Project1`.`LabelId`, 
`Project1`.`Key`, 
`Project1`.`Description`, 
`Project1`.`ModuleId`, 
`Project1`.`C1`, 
`Project1`.`VersionId`, 
`Project1`.`LabelId1`, 
`Project1`.`LanguageId`, 
`Project1`.`UserId`, 
`Project1`.`VersionTypeId`, 
`Project1`.`VersionNumber`, 
`Project1`.`Value`, 
`Project1`.`DepartmentId`, 
`Project1`.`IsExternal`, 
`Project1`.`EnableInheritance`
FROM (SELECT
`Extent1`.`GreetingId`, 
`Extent1`.`From`, 
`Extent1`.`Due`, 
`Extent1`.`TextLabelId`, 
`Extent2`.`LabelId`, 
`Extent2`.`Key`, 
`Extent2`.`Description`, 
`Extent2`.`ModuleId`, 
`Extent3`.`VersionId`, 
`Extent3`.`LabelId` AS `LabelId1`, 
`Extent3`.`LanguageId`, 
`Extent3`.`UserId`, 
`Extent3`.`VersionTypeId`, 
`Extent3`.`VersionNumber`, 
`Extent3`.`Value`, 
`Extent3`.`DepartmentId`, 
`Extent3`.`IsExternal`, 
`Extent3`.`EnableInheritance`, 
CASE WHEN (`Extent3`.`VersionId` IS  NULL) THEN (NULL)  ELSE (1) END AS `C1`
FROM `Greetings` AS `Extent1` INNER JOIN `Labels` AS `Extent2` ON `Extent1`.`TextLabelId` = `Extent2`.`LabelId` LEFT OUTER JOIN `Versions` AS `Extent3` ON `Extent3`.`LabelId` = `Extent1`.`TextLabelId`
 WHERE ('11:51:45' >= `Extent1`.`From`) AND ('11:51:45' <= `Extent1`.`Due`)) AS `Project1`
 ORDER BY 
`Project1`.`GreetingId` ASC, 
`Project1`.`LabelId` ASC, 
`Project1`.`C1` ASC
-- p__linq__0 (dbtype=Time, size=0, direction=Input) = 11:51:45
-- p__linq__1 (dbtype=Time, size=0, direction=Input) = 11:51:45

0 个答案:

没有答案