私はそのような構造を持っています:
public class Tag
{
public int TagId { get; set; }
public virtual ICollection<Vacancy> Vacancies { get; set; }
// ...
}
public class Vacancy
{
public int VacancyId { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
// ...
}
これらのエンティティは、EF/コードファーストアプローチを使用してMSSQLにマップされます。
その後、(ユーザークエリに基づいて)コンテキストからタグのリストを取得します。
List<Tag> userSelectedTags = ...;
これらのタグに含まれる空室の量を計算したいと思います。
int count = userSelectedTags.SelectMany(t => t.Vacancies).Count();
正常に動作しますが、このクエリは十分に最適化されていないようです。プロファイラーに遭遇すると、次のようになります。
exec sp_executesql N'SELECT
[Extent2].[VacancyId] AS [VacancyId],
[Extent2].[Title] AS [Title],
[Extent2].[Salary] AS [Salary],
...props... etc...
FROM [dbo].[VacancyTagVacancies] AS [Extent1]
INNER JOIN [dbo].[Vacancies] AS [Extent2] ON [Extent1].[Vacancy_VacancyId] = [Extent2].[VacancyId]
WHERE [Extent1].[VacancyTag_VacancyTagId] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1
つまり、COUNT sqlキーワードを使用せず、コレクション全体を返し、SQLServerの外部で計算します。
すべてを選択する代わりにここでCOUNTを使用するために、LINQクエリを最適化するにはどうすればよいですか?ありがとう。