簡略化された例:FirstName
、LastName
という表があります。私は、長さでソートされた完全な敬礼がNではないすべての人々を検索することに興味があります。それを達成するために、私はこのようなコードを持っている:Entity Frameworkで投影法を選択してフィルタを適用します。
var result = await Context.People
.Select(p => new PersonWithSalutation
{
FirstName = p.FirstName,
LastName = p.FirstName,
FullSalutation = p.FirstName + " " + p.LastName
})
.Where(p => p.FullSalutation.Length < maxLength)
.OrderBy(p => p.FullSalutation)
.Take(maxResults)
.ToListAsync();
クエリは次のようになります。
SELECT TOP (10)
[Project1].[C1] AS [C1],
[Project1].[Name] AS [Name],
[Project1].[Id] AS [Id],
[Project1].[C2] AS [C2]
FROM (SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
1 AS [C1],
...calculated stuff... AS [C2]
FROM [dbo].[People] AS [Extent1]
WHERE ...exactly the same stuff... <= @p__linq__3
) AS [Project1]
ORDER BY [Project1].[C2] ASC
これは、トリックを行い、データベースへの単一のクエリを生成します。問題は、結果のクエリで2回現れるため、計算された投影です:SELECT
に1回、次にWHERE
に1回です。この例は単純化されていますが、私の実際のケースでは、重度の数学演算を行っています。これは1回だけ計算したいと考えています。上記のように、C2はorder句で再利用されます。私はWHERE
節と同じことをしたいと思いますが、これはさらに別のサブクエリを含むと思われます)。どうすればこれを達成できますか?
私は計算が同じであることを実現するために、SQL Serverを仮定してないだろうこの場合は2回です。あなたはそれが信じる理由がありますか? – John