在我们的解决方案中,我们使用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